Два массива в цикле foreach

99

Я хочу создать, 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>';
    }
?>

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

медк
источник

Ответы:

155
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',
   ...
);
Алекс
источник
полезно при разборе массивов полей формы.
Ryu_hayabusa
85

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

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

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

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

BoltClock
источник
Можно ли это также использовать для трех массивов?
xjshiya
@xjshiya Нет, если вы дадите им 3 параметра, вы получите Предупреждение: array_combine () ожидает ровно 2 параметра из 3 заданных
Джулиан
25

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

$countries = array_combine($codes, $names);
Игнасио Васкес-Абрамс
источник
6

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

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

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

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

Яков Релкин
источник
+1 array_combine()уже создает ассоциативный массив, возможно, вы захотите более четко инициализировать его как ассоциативный.
BoltClock
4

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значения, чтобы заполнить пробел.

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

анкабот
источник
3

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

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

становится:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
Якуб
источник
1
Это называется ассоциативным массивом, а не многомерным массивом.
BoltClock
3

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

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>';
?>
Funk Forty Niner
источник
1
хм ... голос против неуместен. Голосующий против, причина и забота о подробностях? Очевидно сделано "просто потому". Meh ~
Funk Forty Niner
4
Разве это не одно и то же? Я не вижу существенных отличий, кроме названий переменных.
Патрик
3

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

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

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

PerceptorII
источник
3

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

$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>";
}
delAmux
источник
2

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

$array1 = array("foo" => "bar");
$array2 = array("hello" => "world");
$both_arrays = array_merge((array)$array1, (array)$array2);
print_r($both_arrays);
Хайдер Али
источник
2

Выходи ...

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

демо

oLinkWebDevelopment
источник
2
<?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>';

?>
r5d
источник
2

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

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

$ коды = массив ('tn', 'us', 'fr');

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

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

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

пашри
источник
1

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

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

?>
Снежные базы
источник
0

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

Калин Русу
источник
0
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]
....
}
Gvice
источник
0

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

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 />";
}
Улугов
источник
0

Вы должны попробовать это для помещения 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 `
ДЖАДАВ АКАШ
источник
0

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

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,
    );
  }
Тарас Костюк
источник
-2

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

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
Макджарод
источник