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?

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

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.


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


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.


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


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

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

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.


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

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

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


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

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

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.


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

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

?>

0

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


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

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

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 `

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

-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++;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.