Zwei Arrays in jeder Schleife

98

Ich möchte ein selectboxArray mit zwei Arrays generieren , eines mit den Ländercodes und eines mit den Ländernamen.

Dies ist ein Beispiel:

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

Diese Methode hat bei mir nicht funktioniert. Irgendwelche Vorschläge?

medk
quelle

Antworten:

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

Das ist nicht gültig.

Sie wollen wahrscheinlich so etwas ...

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

Alternativ wäre es viel einfacher, die Codes zum Schlüssel Ihres $namesArrays zu machen ...

$names = array(
   'tn' => 'Tunisia',
   'us' => 'United States',
   ...
);
Alex
quelle
nützlich beim Parsen von Formularfeldarrays.
Ryu_hayabusa
85

foreach arbeitet jeweils nur mit einem Array.

So wie Ihr Array strukturiert ist, können Sie array_combine()sie in ein Array von Schlüssel-Wert-Paaren und dann in foreachdieses einzelne Array einteilen:

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

Oder wie in den anderen Antworten zu sehen ist, können Sie stattdessen ein assoziatives Array fest codieren.

BoltClock
quelle
Kann dies auch für drei Arrays verwendet werden?
Xjshiya
@xjshiya Nein, wenn Sie ihnen 3 Parameter geben, erhalten Sie Warnung: array_combine () erwartet genau 2 Parameter, 3 gegeben
Julian
25

Verwenden Sie array_combine()diese Option, um die Arrays miteinander zu verschmelzen und das Ergebnis zu durchlaufen.

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

Verwenden Sie ein assoziatives Array:

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

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

Ich glaube, dass die Verwendung eines assoziativen Arrays der sinnvollste Ansatz ist, im Gegensatz zur Verwendung, array_combine()da Sie, sobald Sie ein assoziatives Array haben, einfach genau das Array verwenden array_keys()oder array_values()erhalten können, das Sie zuvor hatten.

Jacob Relkin
quelle
+1 array_combine()erzeugt bereits ein assoziatives Array. Möglicherweise möchten Sie die Initialisierung als assoziatives Array klarer gestalten .
BoltClock
4

array_map scheint auch dafür gut zu sein

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

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

Weitere Vorteile sind:

  • Wenn ein Array kürzer als das andere ist, empfängt der Rückruf nullWerte, um die Lücke zu füllen.

  • Sie können mehr als 2 Arrays zum Durchlaufen verwenden.

Ankabot
quelle
3

Warum nicht einfach zu einem mehrdimensionalen assoziativen Array zusammenfassen? Scheint, als würden Sie das falsch machen:

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

wird:

$dropdown = array('tn' => 'Tunisia', 'us' => 'United States', 'fr' => 'France');
Jakub
quelle
1
Es wird als assoziatives Array bezeichnet, nicht als mehrdimensionales Array.
BoltClock
3

Alles vollständig getestet

3 Möglichkeiten, um ein dynamisches Dropdown-Menü aus einem Array zu erstellen.

Dadurch wird ein Dropdown-Menü aus einem Array erstellt und der entsprechende Wert automatisch zugewiesen.

Methode 1 (normales Array)

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


Methode 2 (normales Array)

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


Methode 3 (assoziatives Array)

<?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
quelle
1
hm ... unangebrachtes Downvote. Downvoter, Grund und Sorgfalt zu erarbeiten? Offensichtlich "nur weil" gemacht. Meh ~
Funk Forty Niner
4
Sind das nicht alle dasselbe? Ich sehe keine signifikanten Unterschiede außer den Namen der Variablen.
Patrick
3

foreach funktioniert nur mit einem einzelnen Array. Um mehrere Arrays zu durchlaufen, ist es besser, die Funktion each () in einer while-Schleife zu verwenden:

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

each () gibt Informationen über den aktuellen Schlüssel und den Wert des Arrays zurück und erhöht den internen Zeiger um eins oder gibt false zurück, wenn er das Ende des Arrays erreicht hat. Dieser Code wäre nicht abhängig von den zwei Arrays mit identischen Schlüsseln oder derselben Art von Elementen. Die Schleife wird beendet, wenn eines der beiden Arrays beendet ist.

PerceptorII
quelle
3

Das hat bei mir funktioniert:

$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
quelle
Es funktioniert, aber es ist klarer, ein einziges Array mit Codes als Schlüssel und Namen als Werte zu haben ...
Ferdinand.kraft
2

Mit array_merge können Sie zwei Arrays kombinieren und dann durchlaufen.

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

Geh raus ...

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

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

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

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

Demo

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

Versuchen Sie dies anstelle einer foreach-Schleife (nur wenn Ihre Arrays dieselbe Länge haben).

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

Ich denke, dass Sie so etwas tun können:

$ Codes = Array ('tn', 'us', 'fr');

$ names = array ('Tunesien', 'USA', 'Frankreich');

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

Es sollte auch für assoziative Arrays funktionieren.

Pashri
quelle
1

Ich denke, der einfachste Weg ist, die for-Schleife folgendermaßen zu verwenden:

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

Ihr Code wie dieser ist falsch, da er nur für ein einzelnes Array gilt:

<?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, ändern Sie dies:

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

?>
Schneebasen
quelle
0

array_combine()hat bei mir hervorragend funktioniert, als $_POSTmehrere Werte aus mehreren Formulareingaben kombiniert wurden , um die Produktmengen in einem Warenkorb zu aktualisieren.

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

Jetzt können Sie $ a für jedes Array verwenden ....

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

Ich habe ein Problem wie das Ihre folgendermaßen gelöst:

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

Sie sollten dies versuchen, um 2 Arrays in eine einzelne foreach-Schleife zu setzen. Angenommen, ich habe 2 Arrays 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
quelle
0

Nur wenige Arrays können auch so iteriert werden:

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

Für mich geht das

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