2012-02-15 158 views
0
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; 
} 

回答下面的一些问题和我想实现的。php:foreach()如何分配给两个变量

  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) 

输出可能是什么回事?

下为我工作,谢谢hakre

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

您的数组是数字索引的吗? – 2012-02-15 19:09:38

+0

如果一个阵列比另一个阵列短,会发生什么? – Nettogrof 2012-02-15 19:10:30

+0

定义'$ key'两次肯定会导致问题。 – 2012-02-15 19:10:55

回答

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

+2

我不知道这个......有趣。 – 2012-02-15 19:18:30

+0

我希望我能给你10个upvotes – 2012-02-15 19:29:03

+0

如果阵列大小不一样怎么办? 一个键是空的而另一个键的值是? – crush 2012-02-15 19:29:44

-1

您需要使用两个foreach循环。

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

inner for循环会在外循环的每次迭代时得到执行... – crush 2012-02-15 19:12:08

+0

确实,我猜这个问题真的是这个示例代码的意图是什么? – Chris 2012-02-15 19:15:49

+0

这是一个很好的问题LOL – crush 2012-02-15 19:16:17

0

你可能需要重新配置你的逻辑来做你想做的事。任何原因你不能只使用2个foreach循环?或者在另一个里面嵌套一个?

编辑:正如其他人指出的那样,如果PHP没有支持你想要做什么,它不会在所有的安全..所以它可能是,它不:)好东西

0

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

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

简答,no。

你可以做的反而是:

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

foreach ($array2 as $k => $v) 
    performMyLogic($k, $v); 
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); 
} 
+0

这只会在两个数组具有相同数量的元素时才起作用吗? – crush 2012-02-15 19:28:40

+0

这取决于作者想要什么 – alex347 2012-02-15 19:39:36

+0

@ alex347:我在[我的回答](http://stackoverflow.com/a/9299764/367456)中有一个相同的方向:首先是一个基于迭代器的示例,然后是一个第二个基于'while'。 – hakre 2012-02-15 20:03:03

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

但是如果大小是一样的,这将工作。但是你可以改变这个代码。