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


этот метод не работает для меня. Есть предложения?

648   22  

22 ответов:

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',
   ...
);

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

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

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

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

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

$countries = array_combine($codes, $names);

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

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

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

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

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

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

будет:

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

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

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

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

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

ходит...

$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>';
    })
    
  • в select

    array_walk(array_combine($codes,$names), function ($name,$code){ 
        @$opts = '<option value="' . $code . '">' . $name . '</option>';
    })
    echo "<select>$opts</select>";
    

демо

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

?>

вместо цикла 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
  }
}

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

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

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

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

$names = array ('Tunisia', 'United States', 'France');

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

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

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

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

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

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

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

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

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

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

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

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

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,
    );
  }

ваш код, как это неверно, как 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++;
        }

?>

это работает для меня

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}

Если бы это было возможно сделать так, как вам нравится, foreach для 2 массивов будет запрограммирован следующим образом:

//foreach ($array1 as $key1 [,/and/~/'/-/whatever] $array2 as $key2)
    //equals:

    $array1 = array(); 
    $array2 = array();

    if (sizeof(array1) == sizeof(array2)){

    for ($i = 0; i < sizeof(array1) , i++){
    $key1 = $array1[$i]
    $key2 = $array2[$i]

    //the code

    }}

мое решение не идеально, но хорошо для большинства целей.

Comments

    Ничего не найдено.