Два массива в петле foreach

Я хочу создать selectbox используя два массива, один из которых содержит коды стран, а другой – имена стран.

Это пример:

 <?php $codes = array('tn','us','fr'); $names = array('Tunisia','United States','France'); foreach( $codes as $code and $names as $name ) { echo '<option value="' . $code . '">' . $name . '</option>'; } ?> 

Этот метод не работал для меня. Какие-либо предложения?

 foreach( $codes as $code and $names as $name ) { } 

Это неверно.

Вы, наверное, хотите что-то вроде этого …

 foreach( $codes as $index => $code ) { echo '<option value="' . $code . '">' . $names[$index] . '</option>'; } 

Кроме того, было бы намного проще сделать коды ключом вашего массива $names

 $names = array( 'tn' => 'Tunisia', 'us' => 'United States', ... ); 

foreach работает только по одному массиву за раз.

Как ваш массив структурирован, вы можете array_combine() их в массив пар ключ-значение, а затем для этого одиночного массива:

 foreach (array_combine($codes, $names) as $code => $name) { echo '<option value="' . $code . '">' . $name . '</option>'; } 

Или, как видно из других ответов, вы можете жестко закодировать ассоциативный массив.

Используйте array_combine() чтобы объединить массивы и перебрать результат.

 $countries = array_combine($codes, $names); 

Используйте ассоциативный массив:

 $code_names = array( 'tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France'); foreach($code_names as $code => $name) { //... } 

Я считаю, что использование ассоциативного массива – самый разумный подход, а не использование array_combine() потому что если у вас есть ассоциативный массив, вы можете просто использовать array_keys() или array_values() чтобы получить тот же массив, который у вас был раньше.

Почему бы просто не объединиться в многомерный ассоциативный массив? Похоже, вы идете по этому поводу:

 $codes = array('tn','us','fr'); $names = array('Tunisia','United States','France'); 

будет выглядеть так:

 $dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France'); 

Все полностью протестированы

3 способа создания динамического выпадающего списка из массива.

Это создаст выпадающее меню из массива и автоматически присвоит его соответствующее значение.

Метод # 1 (нормальный массив)

 <?php $names = array('tn'=>'Tunisia','us'=>'United States','fr'=>'France'); echo '<select name="countries">'; foreach($names AS $let=>$word){ echo '<option value="'.$let.'">'.$word.'</option>'; } echo '</select>'; ?> 


Метод №2 (нормальный массив)

 <select name="countries"> <?php $countries = array('tn'=> "Tunisia", "us"=>'United States',"fr"=>'France'); foreach($countries as $select=>$country_name){ echo '<option value="' . $select . '">' . $country_name . '</option>'; } ?> </select> 


Метод № 3 (ассоциативный массив)

 <?php $my_array = array( 'tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France' ); echo '<select name="countries">'; echo '<option value="none">Select...</option>'; foreach ($my_array as $k => $v) { echo '<option value="' . $k . '">' . $v . '</option>'; } echo '</select>'; ?> 

Вы можете использовать array_merge для объединения двух массивов, а затем итерации по ним.

 $array1 = array("foo" => "bar"); $array2 = array("hello" => "world"); $both_arrays = array_merge((array)$array1, (array)$array2); print_r($both_arrays); 

Прогулка …

 $codes = array('tn','us','fr'); $names = array('Tunisia','United States','France'); 
  • PHP 5.3+

     array_walk($codes, function ($code,$key) use ($names) { echo '<option value="' . $code . '">' . $names[$key] . '</option>'; }); 
  • До PHP 5.3

     array_walk($codes, function ($code,$key,$names){ echo '<option value="' . $code . '">' . $names[$key] . '</option>'; },$names); 
  • или объединить

     array_walk(array_combine($codes,$names), function ($name,$code){ echo '<option value="' . $code . '">' . $name . '</option>'; }) 
  • в избранном

     array_walk(array_combine($codes,$names), function ($name,$code){ @$opts = '<option value="' . $code . '">' . $name . '</option>'; }) echo "<select>$opts</select>"; 

демонстрация

 <?php $codes = array ('tn','us','fr'); $names = array ('Tunisia','United States','France'); echo '<table>'; foreach(array_keys($codes) as $i) { echo '<tr><td>'; echo ($i + 1); echo '</td><td>'; echo $codes[$i]; echo '</td><td>'; echo $names[$i]; echo '</td></tr>'; } echo '</table>'; ?> 

Вместо цикла foreach попробуйте это (только когда ваши массивы имеют одинаковую длину).

 $number = COUNT($_POST["codes "]);//count how many arrays available if($number > 0) { for($i=0; $i<$number; $i++)//loop thru each arrays { $codes =$_POST['codes'][$i]; $names =$_POST['names'][$i]; //ur code in here } } 

Я думаю, что вы можете сделать что-то вроде:

$ codes = array ('tn', 'us', 'fr');

$ names = array ('Тунис', 'США', 'Франция');

 foreach ($codes as $key => $code) { echo '<option value="' . $code . '">' . $names[$key] . '</option>'; } 

Он также должен работать для ассоциативных массивов.

foreach работает только с одним массивом. Чтобы перейти через несколько массивов, лучше использовать функцию each () в цикле while:

 while(($code = each($codes)) && ($name = each($names))) { echo '<option value="' . $code['value'] . '">' . $name['value'] . '</option>'; } 

Каждый () возвращает информацию о текущем ключе и значении массива и увеличивает внутренний указатель на единицу или возвращает false, если он достиг конца массива. Этот код не будет зависеть от двух массивов, имеющих идентичные ключи или имеющих одинаковые элементы. Цикл завершается, когда один из двух массивов завершен.

$ this-> работа для меня:

 $codes = array('tn','us','fr'); $names = array('Tunisia','United States','France'); foreach( $codes as $key => $value ) { echo "Code is: " . $codes[$key] . " - " . "and Name: " . $names[$key] . "<br>"; 

}

array_combine() отлично поработал для меня, комбинируя $_POST несколько значений из нескольких входных форм в попытке обновить количество продуктов в корзине покупок.

 if(isset($_POST['doors'])=== true){ $doors = $_POST['doors']; }else{$doors = 0;} if(isset($_POST['windows'])=== true){ $windows = $_POST['windows']; }else{$windows = 0;} foreach($doors as $a => $b){ 

Теперь вы можете использовать $ a для каждого массива ….

 $doors[$a] $windows[$a] .... } 

Я решил такую ​​проблему, как ваша:

 foreach(array_keys($idarr) as $i) { echo "Student ID: ".$idarr[$i]."<br />"; echo "Present: ".$presentarr[$i]."<br />"; echo "Reason: ".$reasonarr[$i]."<br />"; echo "Mark: ".$markarr[$i]."<br />"; } 

Вы должны попробовать это для размещения массива 2 в одиночном цикле foreach. Предположим, у меня есть 2 массива 1. $ item_nm 2. $ item_qty

  `<?php $i=1; ?> <table><tr><td>Sr.No</td> <td>item_nm</td> <td>item_qty</td> </tr> @foreach (array_combine($item_nm, $item_qty) as $item_nm => $item_qty) <tr> <td> $i++ </td> <td> $item_nm </td> <td> $item_qty </td> </tr></table> @endforeach ` 

Несколько массивов также можно повторить следующим образом:

 foreach($array1 as $key=>$val){ // Loop though one array $val2 = $array2[$key]; // Get the values from the other arrays $val3 = $array3[$key]; $result[] = array( //Save result in third array 'id' => $val, 'quant' => $val2, 'name' => $val3, ); } 

Я думаю, что самый простой способ – просто использовать цикл for таким образом:

 $codes = array('tn','us','fr'); $names = array('Tunisia','United States','France'); for($i = 0; $i < sizeof($codes); $i++){ echo '<option value="' . $codes[$i] . '">' . $names[$i] . '</option>'; } 

меня устраивает

 $counter = 0; foreach($codes as $code) { $codes_array[$counter]=$code; $counter++; } $counter = 0; foreach($names as $name) { echo $codes_array[$counter]."and".$name; $counter++; }