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


98

Я хочу генерувати, 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 задано
Julian


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значення для заповнення пробілу.

  • Ви можете використовувати більше 2-х масивів для ітерації через.


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
hm ... downvote uncalled for. Першокласніше, розум і турботу розробити? Очевидно зроблено "просто боз". Meh ~
Funk Forty Niner

4
Хіба це не одне і те ж? Я не бачу суттєвих відмінностей, крім назв змінних.
Патрік

3

foreach працює лише з одним масивом. Щоб перейти через декілька масивів, краще використовувати функцію кожного () в циклі часу:

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

кожен () повертає інформацію про поточний ключ і значення масиву і збільшує внутрішній покажчик на один, або повертає помилкову, якщо вона досягла кінця масиву. Цей код не залежатиме від двох масивів, що мають однакові ключі або мають однакові елементи. Цикл закінчується, коли один з двох масивів закінчений.


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

Це працює, але зрозуміліше мати єдиний масив з кодами як ключами та іменами як значення ...
Ferdinand.kraft

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

Ваш код, подібний до цього, є невірним, оскільки пропонується лише для одного масиву

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