php:foreach()如何分配给两个变量

时间:2012-02-15 19:08:03

标签: php foreach

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数组。
  6. @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 ) 
    

    可能出现什么问题?

    以下为我工作,谢谢你hakre

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

7 个答案:

答案 0 :(得分:11)

它与您使用伪代码勾勒的方式不起作用。但是,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;
}

查看实际操作:Demo

修改:第一个示例显示了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);
}

Demo (the minimum number of elements are iterated)


请参阅相关问题:Multiple index variables in PHP foreach loop

答案 1 :(得分:2)

一般情况下你不能在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);
}

答案 2 :(得分:1)

简答,不。

你能做的是:

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

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

答案 3 :(得分:0)

您可能需要重新配置逻辑以执行您想要的操作。你有什么理由不能只使用2个foreach循环吗?或者在另一个内嵌一个?

编辑:正如其他人所指出的那样,如果PHP确实支持你想要做的事情,它根本就不安全......所以它可能是一件好事,它不会:)

答案 4 :(得分:0)

如果密钥相同,您可以这样做:

foreach ($choices as $key => $choice) {
    $vtitle = $vtitles[$key];
}

答案 5 :(得分:0)

也许你想要这个:

//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
    }
}

但如果尺寸相同,这将有效。但是你可以改变这段代码。

答案 6 :(得分:-1)

你需要使用两个foreach循环。

foreach ($choices as $keyChoice => $choice)
{
    foreach ($vtitles as $keyVtitle => $vtitle)
    {
        //Code to work on values here
    }
}