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

Я хочу сгенерировать a 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>';
    }
?>

Этот метод не работал у меня. Любые предложения?

Ответ 1

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',
   ...
);

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

foreach($code_names as $code => $name) {
   //...
}

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

Ответ 5

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

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

становится:

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

Ответ 6

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

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

Ответ 7

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

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>';
?>

Ответ 8

Пройдите его...

$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>";
    

демо

Ответ 9

<?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>';

?>

Ответ 10

Это сработало для меня:

$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>";
}

Ответ 11

Вместо цикла 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
  }
}

Ответ 12

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

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

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

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

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

Ответ 13

Я думаю, что самый простой способ - просто использовать цикл 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>';
}

Ответ 14

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

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

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

Ответ 15

array_map тоже подходит для этого

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

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

Другие преимущества:

  • Если один массив короче другого, обратный вызов получает значения null, чтобы заполнить пробел.

  • Вы можете использовать более 2 массивов для перебора.

Ответ 16

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

Ответ 17

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

Ответ 18

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

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

Ответ 19

Вы должны попробовать это для размещения массива 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 `

Ответ 20

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

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,
    );
  }

Ответ 21

Ваш код, подобный этому, неверен, так как foreach только для одного массива:

<?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>';
            }
?>

Альтернатива, измените на это:

<?php
        $codes = array('tn','us','fr');
        $names = array('Tunisia','United States','France');
        $count = 0;

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

?>

Ответ 22

он работает для меня

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