Два массива в цикле foreach - PullRequest
       35

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

86 голосов
/ 19 декабря 2010

Я хочу сгенерировать 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 ]

139 голосов
/ 19 декабря 2010
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',
   ...
);
79 голосов
/ 19 декабря 2010

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

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

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

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

25 голосов
/ 19 декабря 2010

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

$countries = array_combine($codes, $names);
6 голосов
/ 19 декабря 2010

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

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

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

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

3 голосов
/ 19 декабря 2010

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

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

становится:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
2 голосов
/ 17 мая 2012

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

$array1 = array("foo" => "bar");
$array2 = array("hello" => "world");
$both_arrays = array_merge((array)$array1, (array)$array2);
print_r($both_arrays);
2 голосов
/ 07 августа 2013

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

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>';
?>
2 голосов
/ 19 февраля 2017

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

$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 голосов
/ 12 марта 2017

Вместо цикла 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
  }
}
2 голосов
/ 25 марта 2014

Выйти ...

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

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...