2012-02-15 161 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 
    } 
} 

但是如果大小是一樣的,這將工作。但是你可以改變這個代碼。