php: foreach () как назначить две переменные - PullRequest
0 голосов
/ 15 февраля 2012
function example()
{

    foreach ($choices as $key => $choice) {       # \__ both should run parallel
    foreach ($vtitles as $keystwo => $vtitle) {   # /

        $options .= '<option value="'. check_plain($key) .'" title="' . $vtitle . '"' . $selected  
.'>'. check_plain($choice) .'</option>';


    } // end of vtitle    
    } // end of choice

    return $options;
}

Ответы на некоторые из приведенных ниже вопросов и то, что я пытаюсь достичь.

  1. Массив $choices не имеет числовой индексации.
  2. Массив $vtitle имеет числовую индексацию.
  3. Они не будут короче друг друга, так как у меня есть код, который позаботится об этом до запуска этого кода.
  4. Я пытаюсь вернуть $options переменную. Проблема в том, что $choices[0] и $vtitle[0] должны использоваться только один раз. Надеюсь, я смог выразить свою проблему.
  5. Я не хочу проходить массив $vtitles один раз для каждого значения в $choices.

@ hakre: спасибо, я почти решил это с вашей помощью.

Я получаю ошибку для переменной $vtitle:

InvalidArgumentException: Passed variable is not an array or object, using empty array    
instead in ArrayIterator->__construct() (line 35 of /home/vishal/Dropbox/sites/chatter/sites
/all/themes/kt_vusers/template.php).

Я уверен, что это массив, это вывод с использованием print_r

Array ( [0] => vishalkh [1] => newandold ) 

Что может быть не так?

ниже работал для меня, спасибо, хакре

while
(
(list($key1, $value1) = each($array1))
&& (list($key2, $value2) = each($array2))
)
{
printf("%s => %s, %s => %s \n", $key1, $value1, $key2, $value2);
}

Ответы [ 7 ]

11 голосов
/ 15 февраля 2012

Это не работает так, как вы рисуете псевдокодом. Тем не менее, SPL предлагает способ повторять несколько итераторов одновременно. Он называется MultipleIterator, и вы можете присоединить столько итераторов, сколько захотите:

$multi = new MultipleIterator();
$multi->attachIterator(new ArrayIterator($array1));
$multi->attachIterator(new ArrayIterator($array2));

foreach($multi as $value)
{
    list($key1, $key2) = $multi->key();
    list($value1, $value2) = $value;
}

Посмотреть в действии: Демо

Редактировать: Первый пример показывает предложение из SPL. Преимущество в том, что он может работать с любыми итераторами, не только с массивами. Если вы хотите выразить нечто похожее с массивами, вы можете добиться чего-то похожего с классическим циклом while(list()=each()), который допускает больше выражений, чем foreach.

while
(
    (list($key1, $value1) = each($array1))
    && (list($key2, $value2) = each($array2))
)
{
    printf("%s => %s, %s => %s \n", $key1, $value1, $key2, $value2);
}

Демонстрация (минимальное количество повторяемых элементов)


См. Также связанный вопрос: Несколько индексных переменных в цикле PHP foreach

2 голосов
/ 15 февраля 2012

вы не можете сделать это в цикле foreach в общем случае.Но вы можете сделать это следующим образом в PHP5:

$obj1 = new ArrayObject($arr1);
$it1 = $obj1->getIterator();

$obj2 = new ArrayObject($arr2);
$it2 = $obj2->getIterator();

while( $it1->valid() && $it2->valid())
{
    echo $it1->key() . "=" . $it1->current() . "\n";
    $it1->next();

    echo $it2->key() . "=" . $it2->current() . "\n";
    $it2->next();    
}

В старых версиях PHP это будет выглядеть так:

while (($choice = current($choices)) && ($vtitle = current($vtitles))) {       
    $key_choice = key($choices);
    $key_vtitle = key($vtitles);
    next($choices);
    next($vtitles);
}
1 голос
/ 15 февраля 2012

Короткий ответ, №

Вместо этого вы можете:

foreach ($array1 as $k => $v)
    performMyLogic($k, $v);

foreach ($array2 as $k => $v)
    performMyLogic($k, $v);
0 голосов
/ 15 февраля 2012

Может быть, вы хотите это:

//get theirs keys
$keys_choices = array_keys($choices);
$keys_vtitles = array_keys($vtitles);

//the same size I guess
if (count($keys_choices) === count($keys_vtitles)) {

    for ($i = 0;$i < count($keys_choices); $i++) {

        //First array
        $key_1 = $keys_choices[$i];
        $value_1 = $choices[$keys_choices[$i]];

        //second_array
        $key_2 = $key_vtitles[$i];
        $value_2 = $vtitles[$keys_vtitles[$i]];

        //and you can operate
    }
}

Но это будет работать, если размер такой же.Но вы можете изменить этот код.

0 голосов
/ 15 февраля 2012

Если ключи одинаковые, вы можете сделать это:

foreach ($choices as $key => $choice) {
    $vtitle = $vtitles[$key];
}
0 голосов
/ 15 февраля 2012

Возможно, вам придется изменить свою логику, чтобы делать то, что вы хотите.По какой причине вы не можете просто использовать 2 цикла foreach?Или вкладывать одно внутрь другого?

РЕДАКТИРОВАТЬ: как уже отмечали другие, если PHP поддерживает то, что вы пытаетесь сделать, это не будет безопасно вообще ... так что, вероятно, это хорошо, что это не так:)

0 голосов
/ 15 февраля 2012

Вам нужно использовать два цикла foreach.

foreach ($choices as $keyChoice => $choice)
{
    foreach ($vtitles as $keyVtitle => $vtitle)
    {
        //Code to work on values here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...