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

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


Можно ли это также использовать для трех массивов?
xjshiya

@xjshiya Нет, если вы дадите им 3 параметра, вы получите Предупреждение: array_combine () ожидает ровно 2 параметра из 3 заданных
Джулиан


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

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, если он достиг конца массива. Этот код не будет зависеть от двух массивов, имеющих одинаковые ключи или одинаковых элементов. Цикл завершается, когда заканчивается один из двух массивов.


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

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

демо


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

?>

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

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

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

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++;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.