Два массива в цикле 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>'
    }
?>

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

Всего 21 ответ


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_keys() или array_values() чтобы получить точно такой же массив, что и раньше.


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

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

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

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

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

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

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

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

Пройдите ...

$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('Tunisia', 'United States', 'France');
foreach($codes as $key => $value) {
    echo "Code is: " . $codes[$key] . " - " . "and Name: " . $names[$key] . "<br>";
}

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

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

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

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

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


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

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

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

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


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 в цикле singlr 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,
    );
  }

Ваш код, подобный этому, неверен, так как 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++;
        }

?>

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

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

Есть идеи?

10000