it-roy-ru.com

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

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

78
medk
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',
   ...
);
133
alex

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

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

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

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

75
BoltClock

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

$countries = array_combine($codes, $names);
23
Ignacio Vazquez-Abrams

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

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

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

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

6
Jacob Relkin

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

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

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

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

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

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>';
?>
3
Funk Forty Niner

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

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

Попробуйте это вместо цикла 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
fchan
<?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
r5d

Пройдите ...

$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
oLinkWebDevelopment

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

$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
delAmux

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

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

$ names = array ('Тунис', 'Соединенные Штаты', 'Франция');

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

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

1
pashri

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

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

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

1
PerceptorII

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

Я решил проблему, подобную вашей, следующим образом:

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
Ulugov

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

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

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

0
Calin Rusu

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

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