Deux tableaux dans la boucle foreach

Je veux générer un selectbox en utilisant deux tableaux, l'un contenant les codes de pays et l'autre contenant les noms de pays.

Voici un exemple:

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

Cette méthode n'a pas fonctionné pour moi. Toutes les suggestions?

75
demandé sur Jolta 2010-12-19 02:41:52

22 réponses

foreach( $codes as $code and $names as $name ) { }

Ce n'est pas valide.

, Vous voulez probablement quelque chose comme ça...

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

Alternativement, il serait beaucoup plus facile de faire des codes la clé de votre tableau $names...

$names = array(
   'tn' => 'Tunisia',
   'us' => 'United States',
   ...
);
127
répondu alex 2010-12-18 23:43:24

foreach fonctionne sur un seul tableau à la fois.

La façon dont votre tableau est structuré, vous pouvez array_combine() dans un tableau de paires clé-valeur, puis foreach, que seul tableau:

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

Ou comme on le voit dans les autres réponses, vous pouvez coder en dur un tableau associatif à la place.

68
répondu BoltClock 2010-12-18 23:44:21

Utiliser array_combine() pour fusionner des tableaux et itérer sur le résultat.

$countries = array_combine($codes, $names);
22
répondu Ignacio Vazquez-Abrams 2010-12-18 23:43:59

Utiliser un tableau associatif:

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

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

Je crois que l'utilisation d'un tableau associatif est l'approche la plus raisonnable, par opposition à l'aide de array_combine(), car une fois que vous avez un tableau associatif, vous pouvez simplement utiliser array_keys() ou array_values() pour obtenir exactement le même tableau que vous aviez avant.

6
répondu Jacob Relkin 2010-12-18 23:53:00

Pourquoi ne pas simplement consolider dans un tableau associatif multidimensionnel? On dirait que vous allez à ce sujet mal:

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

Devient:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
3
répondu Jakub 2010-12-18 23:45:28

Tous entièrement testés

3 façons de créer une liste déroulante dynamique à partir d'un tableau.

Cela créera un menu déroulant à partir d'un tableau et affectera automatiquement sa valeur respective.

Méthode # 1 (Tableau Normal)

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

?>


Méthode # 2 (Tableau Normal)

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


Méthode # 3 (Tableau Associatif)

<?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
répondu Funk Forty Niner 2013-08-07 07:50:10

Vous pouvez utiliser array_merge pour combiner deux tableaux,puis les parcourir.

$array1 = array("foo" => "bar");
$array2 = array("hello" => "world");
$both_arrays = array_merge((array)$array1, (array)$array2);
print_r($both_arrays);
2
répondu Haider Ali 2012-05-17 15:38:47

Marchez...

$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>';
    });
    
  • Avant PHP 5.3

    array_walk($codes, function ($code,$key,$names){ 
        echo '<option value="' . $code . '">' . $names[$key] . '</option>';
    },$names);
    
  • , Ou combiner

    array_walk(array_combine($codes,$names), function ($name,$code){ 
        echo '<option value="' . $code . '">' . $name . '</option>';
    })
    
  • Dans sélectionnez

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

Démo

2
répondu oLinkWebDevelopment 2014-03-28 01:30:01
<?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
répondu r5d 2015-09-07 02:19:02

Au lieu de foreach loop, essayez ceci (uniquement lorsque vos tableaux ont la même longueur).

$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
répondu fchan 2017-03-12 14:45:18

Cela a fonctionné pour moi:

$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
répondu delAmux 2018-05-10 09:30:29

Je pense que vous pouvez faire quelque chose comme:

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

$noms = array('Tunisie','Etats-unis','France');

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

Cela devrait également fonctionner pour les tableaux associatifs.

1
répondu pashri 2016-07-07 14:49:45

Je pense que le moyen le plus simple est juste d'utiliser la boucle for de cette façon:

$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
répondu SeReGa 2016-07-16 08:13:12

Foreach ne fonctionne qu'avec un seul tableau. Pour parcourir plusieurs tableaux, il est préférable d'utiliser la fonction each () dans une boucle while:

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

Each() renvoie des informations sur la clé et la valeur actuelles du tableau et incrémente le pointeur interne d'un, ou renvoie false s'il a atteint la fin du tableau. Ce code ne dépendrait pas des deux tableaux ayant des clés identiques ou ayant le même type d'éléments. La boucle se termine lorsque l'un des deux tableaux est terminer.

1
répondu PerceptorII 2017-01-06 18:53:16

array_combine() cela a très bien fonctionné pour moi tout en combinant {[1] } plusieurs valeurs à partir de plusieurs entrées de formulaire dans le but de mettre à jour les quantités de produits dans un panier.

0
répondu Calin Rusu 2012-12-21 00:04:48
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){

Maintenant, vous pouvez utiliser $pour chaque tableau....

$doors[$a]
$windows[$a]
....
}
0
répondu Gvice 2013-02-07 03:10:42

J'ai résolu un problème comme le vôtre de cette façon:

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
répondu Ulugov 2013-02-19 13:34:48

Vous devriez essayer ceci pour le tableau putting 2 dans la boucle singlr foreach Supposons que j'ai 2 Tableau 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
répondu JADAV AKASH 2015-03-02 10:43:53

Quelques tableaux peuvent également être itérés comme ceci:

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
répondu Тарас Костюк 2015-10-20 08:27:08

Votre code comme celui-ci est incorrect car foreach uniquement pour un seul tableau:

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

Alternative, changer à ceci:

<?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
répondu Nao Desu 2018-05-21 05:12:02

Ça marche pour moi

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
-1
répondu mcjarod 2013-07-17 16:44:51

S'il serait possible de faire ce que vous voulez, le foreach pour 2 tableaux serait programmé comme ça:

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

    }}

Ma solution n'est pas parfaite mais convient à la plupart des fins.

-2
répondu Jannis 2018-07-23 14:37:34