Deux tableaux dans la boucle foreach

99

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

Ceci est 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. Aucune suggestion?

medk
la source

Réponses:

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

Ce n'est pas valable.

Vous voulez probablement quelque chose comme ça ...

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

Sinon, il serait beaucoup plus facile de faire des codes la clé de votre $namestableau ...

$names = array(
   'tn' => 'Tunisia',
   'us' => 'United States',
   ...
);
Alex
la source
utile pour analyser les tableaux de champs de formulaire.
Ryu_hayabusa
85

foreach ne fonctionne que sur une seule baie à la fois.

La façon dont votre tableau est structuré, vous pouvez les array_combine()créer dans un tableau de paires clé-valeur puis dans foreachce tableau unique:

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.

BoltClock
la source
Cela peut-il également être utilisé pour trois tableaux?
xjshiya
@xjshiya Non, si vous leur donnez 3 paramètres, vous obtenez Attention: array_combine () attend exactement 2 paramètres, 3 donnés
Julian
25

Utilisez array_combine()pour fusionner les tableaux ensemble et parcourir le résultat.

$countries = array_combine($codes, $names);
Ignacio Vazquez-Abrams
la source
6

Utilisez un tableau associatif:

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

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

Je pense que l'utilisation d'un tableau associatif est l'approche la plus sensée par opposition à l'utilisation, array_combine()car une fois que vous avez un tableau associatif, vous pouvez simplement utiliser array_keys()ou array_values()obtenir exactement le même tableau que vous aviez auparavant.

Jacob Relkin
la source
+1 array_combine()produit déjà un tableau associatif, vous voudrez peut-être être plus clair sur son initialisation en tant qu'associatif.
BoltClock
4

array_map semble bon pour cela aussi

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

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

Les autres avantages sont:

  • Si un tableau est plus court que l'autre, le rappel reçoit des nullvaleurs pour combler l'espace.

  • Vous pouvez utiliser plus de 2 tableaux pour parcourir.

Ankabot
la source
3

Pourquoi ne pas consolider juste dans un pluridimensionnelle tableau associatif? On dirait que vous vous trompez:

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

devient:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
Jakub
la source
1
C'est ce qu'on appelle un tableau associatif, pas un tableau multidimensionnel.
BoltClock
3

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 attribuera automatiquement sa valeur respective.

Méthode n ° 1 (matrice normale)

<?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 n ° 2 (matrice normale)

<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 n ° 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>';
?>
Funk Forty Niner
la source
1
hm ... un vote défavorable injustifié. Downvoter, raison et souci d'élaborer? Évidemment fait "juste parce que". Meh ~
Funk Forty Niner
4
N'est-ce pas la même chose? Je ne vois aucune différence significative autre que les noms des variables.
Patrick
3

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 de 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 terminé.

Percepteur II
la source
3

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>";
}
delAmux
la source
Cela fonctionne, mais il est plus clair d'avoir un seul tableau avec des codes comme clés et des noms comme valeurs ...
Ferdinand.kraft
2

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);
Haider Ali
la source
2

Sortez-le ...

$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électionner

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

démo

oLinkWebDevelopment
la source
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>';

?>
r5d
la source
2

Au lieu de la boucle foreach, 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
  }
}
fchan
la source
1

Je pense que vous pouvez faire quelque chose comme:

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

$ names = array ('Tunisie', 'États-Unis', 'France');

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

Cela devrait également fonctionner pour les tableaux associatifs.

pashri
la source
1

Je pense que le moyen le plus simple est simplement 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>';
}
SeReGa
la source
1

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, changez pour 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++;
        }

?>
Bases à neige
la source
0

array_combine()a très bien fonctionné pour moi en combinant $_POSTplusieurs valeurs à partir de plusieurs entrées de formulaire dans le but de mettre à jour les quantités de produits dans un panier.

Calin Rusu
la source
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){

Vous pouvez maintenant utiliser $ a pour chaque tableau ....

$doors[$a]
$windows[$a]
....
}
Gvice
la source
0

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 />";
}
Ulugov
la source
0

Vous devriez essayer ceci pour le tableau mettant 2 dans la boucle foreach singlr Supposons que j'ai 2 tableaux 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 `
JADAV AKASH
la source
0

Peu de 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,
    );
  }
Тарас Костюк
la source
-2

ç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++;
}
Mcjarod
la source