web-dev-qa-db-fra.com

Deux tableaux en boucle foreach

Je veux générer une selectbox en utilisant 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?

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

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

$names = array(
   'tn' => 'Tunisia',
   'us' => 'United States',
   ...
);
133
alex

foreach opère sur un seul tableau à la fois.

De la manière dont votre tableau est structuré, vous pouvez array_combine() les transformer en un tableau de paires clé-valeur, puis foreach ce tableau unique:

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

Ou, comme indiqué dans les autres réponses, vous pouvez plutôt coder en dur un tableau associatif.

75
BoltClock

Utilisez array_combine() pour fusionner les tableaux et effectuer une itération sur le résultat.

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

Utilisez 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 judicieuse, par opposition à l'utilisation 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 précédemment.

6
Jacob Relkin

Pourquoi ne pas simplement consolider dans un multidimensionnel 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');
3
Jakub

Tous entièrement testés

3 façons de créer un menu déroulant dynamique à partir d'un tableau.

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

Méthode n ° 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 n ° 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 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>';
?>
3
Funk Forty Niner

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

Essayez ceci au lieu d’une boucle foreach (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
fchan
<?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
r5d

Promène-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 select

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

démo

2

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
delAmux

Je pense que vous pouvez faire quelque chose comme:

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

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

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

Cela devrait également fonctionner pour les tableaux associatifs.

1
pashri

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 point ou renvoie false s'il a atteint la fin du tableau. Ce code ne dépendrait pas du fait que les deux tableaux ont des clés identiques ou ont le même type d’éléments. La boucle se termine lorsque l'un des deux tableaux est terminé.

1
PerceptorII

Je pense que le moyen le plus simple est 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
SeReGa

J'ai résolu un problème comme le vôtre de cette manière:

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
Ulugov

Peu de tableaux peuvent aussi ê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,
    );
  }

array_combine() a fonctionné très bien pour moi tout en combinant $_POST plusieurs valeurs provenant de plusieurs entrées de formulaire afin de mettre à jour les quantités de produits dans un panier.

0
Calin Rusu

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

<?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
Snow Bases
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 $ a pour chaque tableau ....

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

Vous devriez essayer ceci pour le tableau 2 en boucle unique pour chaque boucle 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
JADAV AKASH

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 null valeurs pour combler le vide.

  • Vous pouvez utiliser plus de 2 tableaux pour effectuer une itération.

0
ankabout