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?

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

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.


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


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.


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


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

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

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


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

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

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


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

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

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.


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

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

?>

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.


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

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

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 `

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

-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++;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.