Pregunta Dos matrices en el bucle foreach


Quiero generar un selectbox utilizando dos matrices, una que contiene los códigos de país y otra que contiene los nombres de 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?


75
2017-12-18 23:41


origen


Respuestas:


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

Eso no es valido

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 $names formación...

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

126
2017-12-18 23:43



foreach opera en una sola matriz a la vez.

La forma en que está estructurada tu matriz, puedes array_combine() en una matriz de pares clave-valor, entonces foreach esa ú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.


67
2017-12-18 23:44



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

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

22
2017-12-18 23:43



Use una matriz asociativa:

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

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

Creo que el uso de una matriz asociativa es el enfoque más sensato en comparación con el uso array_combine() porque una vez que tienes una matriz asociativa, puedes simplemente usar array_keys() o array_values() para obtener exactamente el mismo conjunto que tenía antes.


6
2017-12-18 23:44



¿Por qué no simplemente consolidar en un multidimensional matriz asociativa? 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');

3
2017-12-18 23:45



Todo completamente probado

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

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

Método n. ° 1 (arreglo 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 (arreglo 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>';
?>

3
2017-08-07 07:50



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

2
2018-05-17 15:38



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


2
2018-03-25 05:59



<?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
2017-09-07 02:19



En lugar de bucle foreach, 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
  }
}

2
2018-03-12 14:45