Dos matrices en foreach loop

98

Quiero generar un selectbox usando dos matrices, una que contiene los códigos de país y otra que contiene los nombres de los países.

Esto es un ejemplo:

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

Este método no funcionó para mí. ¿Alguna sugerencia?

medk
fuente

Respuestas:

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

Eso no es válido.

Probablemente quieras algo como esto ...

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

Alternativamente, sería mucho más fácil hacer que los códigos sean la clave de su $namesmatriz ...

$names = array(
   'tn' => 'Tunisia',
   'us' => 'United States',
   ...
);
alex
fuente
útil para analizar matrices de campos de formulario.
Ryu_hayabusa
85

foreach opera en una sola matriz a la vez.

La forma en que está estructurada su matriz, puede array_combine()convertirlas en una matriz de pares clave-valor y luego en foreachesa única matriz:

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

O como se ve en las otras respuestas, puede codificar una matriz asociativa en su lugar.

BoltClock
fuente
¿Se puede usar esto también para tres matrices?
xjshiya
@xjshiya No, si les da 3 parámetros obtendrá Advertencia: array_combine () espera exactamente 2 parámetros, 3 dados
Juliano
25

Úselo array_combine()para fusionar las matrices e iterar sobre el resultado.

$countries = array_combine($codes, $names);
Ignacio Vázquez-Abrams
fuente
6

Utilice una matriz asociativa:

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

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

Creo que usar una matriz asociativa es el enfoque más sensato en lugar de usarlo array_combine()porque una vez que tiene una matriz asociativa, puede simplemente usar array_keys()o array_values()para obtener exactamente la misma matriz que tenía antes.

Jacob Relkin
fuente
+1 array_combine()ya produce una matriz asociativa, es posible que desee ser más claro al inicializarla como asociativa.
BoltClock
4

array_map también parece bueno para esto

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

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

Otros beneficios son:

  • Si una matriz es más corta que la otra, la devolución de llamada recibe nullvalores para llenar el espacio.

  • Puede utilizar más de 2 matrices para recorrer en iteración.

ankabot
fuente
3

¿Por qué no simplemente consolidarlo en una matriz asociativa multidimensional ? Parece que estás haciendo esto mal:

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

se convierte en:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
Jakub
fuente
1
Se llama matriz asociativa, no matriz multidimensional.
BoltClock
3

Todo completamente probado

3 formas de crear un menú desplegable dinámico a partir de una matriz.

Esto creará un menú desplegable a partir de una matriz y asignará automáticamente su valor respectivo.

Método n. ° 1 (matriz 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étodo n. ° 2 (matriz 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étodo n. ° 3 (matriz asociativa)

<?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 cuarenta y nueve
fuente
1
hm ... voto en contra injustificado. Votante negativo, ¿razón y cuidado para explicarlo? Obviamente hecho "sólo porque". Meh ~
Funk Forty Niner
4
¿No son todos lo mismo? No veo ninguna diferencia significativa más que los nombres de las variables.
Patrick
3

foreach solo funciona con una única matriz. Para recorrer varias matrices, es mejor usar la función each () en un ciclo while:

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

each () devuelve información sobre la clave actual y el valor de la matriz e incrementa el puntero interno en uno, o devuelve falso si ha llegado al final de la matriz. Este código no dependería de que las dos matrices tengan claves idénticas o que tengan el mismo tipo de elementos. El ciclo termina cuando termina una de las dos matrices.

PerceptorII
fuente
3

Esto funcionó para mí:

$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
fuente
Funciona, pero es más claro tener una sola matriz con códigos como claves y nombres como valores ...
Ferdinand.kraft
2

Puede usar array_merge para combinar dos matrices y luego iterar sobre ellas.

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

Caminar hacia fuera...

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

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

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

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

manifestación

oLinkWebDevelopment
fuente
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
fuente
2

En lugar de foreach loop, intente esto (solo cuando sus matrices tengan la misma longitud).

$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
fuente
1

Creo que puedes hacer algo como:

$ códigos = matriz ('tn', 'us', 'fr');

$ nombres = matriz ('Túnez', 'Estados Unidos', 'Francia');

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

También debería funcionar para matrices asociativas.

pashri
fuente
1

Creo que la forma más sencilla es usar el bucle for de esta manera:

$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
fuente
1

Su código como este es incorrecto como foreach solo para una sola matriz:

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

Alternativa, cambie a esto:

<?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 de nieve
fuente
0

array_combine()funcionó muy bien para mí al combinar $_POSTmúltiples valores de múltiples entradas de formulario en un intento de actualizar las cantidades de productos en un carrito de compras.

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

Ahora puede usar $ a para cada matriz ...

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

Resolví un problema como el tuyo de esta manera:

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

Debería probar esto para la matriz de poner 2 en el bucle foreach de singlr. Suponga que tengo 2 matriz 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
fuente
0

Algunas matrices también se pueden iterar de esta manera:

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

esto funciona para mi

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