Dwie tablice w pętli foreach


99

Chcę wygenerować za selectboxpomocą dwóch tablic, jednej zawierającej kody krajów, a drugiej zawierającej nazwy krajów.

To jest przykład:

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

Ta metoda nie zadziałała dla mnie. Jakieś sugestie?

Odpowiedzi:


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

To nie jest ważne.

Prawdopodobnie chcesz czegoś takiego ...

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

Alternatywnie, byłoby znacznie łatwiej uczynić kody kluczem twojej $namestablicy ...

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

przydatne przy analizowaniu tablic pól formularza.
Ryu_hayabusa

85

foreach działa tylko na jednej tablicy naraz.

Sposób, w jaki jest zbudowana tablica, umożliwia array_combine()utworzenie tablicy par klucz-wartość, a następnie foreachtej pojedynczej tablicy:

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

Lub, jak widać w innych odpowiedziach, możesz zamiast tego zakodować tablicę asocjacyjną.


Czy można tego również użyć dla trzech tablic?
xjshiya

@xjshiya Nie, jeśli podasz im 3 parametry, otrzymasz Ostrzeżenie: array_combine () oczekuje dokładnie 2 parametrów, 3 podane
Julian


6

Użyj tablicy asocjacyjnej:

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

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

Uważam, że użycie tablicy asocjacyjnej jest najbardziej rozsądnym podejściem w przeciwieństwie do używania, array_combine()ponieważ gdy masz tablicę asocjacyjną, możesz po prostu użyć array_keys()lub array_values()uzyskać dokładnie tę samą tablicę, co wcześniej.


+1 array_combine()już tworzy tablicę asocjacyjną, możesz chcieć być bardziej przejrzystym, jeśli chodzi o inicjowanie jej jako asocjacyjnej.
BoltClock

4

array_map też wydaje się dobra do tego

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

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

Inne korzyści to:

  • Jeśli jedna tablica jest krótsza od drugiej, wywołanie zwrotne otrzyma nullwartości wypełniające lukę.

  • Do iteracji możesz użyć więcej niż 2 tablic.


3

Dlaczego po prostu nie skonsolidować w wielowymiarową tablicę asocjacyjną? Wygląda na to, że robisz to źle:

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

staje się:

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

1
Nazywa się to tablicą asocjacyjną, a nie tablicą wielowymiarową.
BoltClock

3

Wszystko w pełni przetestowane

3 sposoby tworzenia dynamicznego menu rozwijanego z tablicy.

Spowoduje to utworzenie menu rozwijanego z tablicy i automatyczne przypisanie odpowiedniej wartości.

Metoda nr 1 (normalna tablica)

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


Metoda nr 2 (normalna tablica)

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


Metoda nr 3 (tablica asocjacyjna)

<?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 ... głos przeciw nie jest potrzebny. Głośnik, rozsądek i chęć rozwinięcia? Oczywiście zrobione „bo tak”. Meh ~
Funk Forty Niner

4
Czy to wszystko nie jest tym samym? Nie widzę żadnych istotnych różnic poza nazwami zmiennych.
Patrick

3

foreach działa tylko z jedną tablicą. Aby przejść przez wiele tablic, lepiej jest użyć funkcji each () w pętli while:

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

each () zwraca informacje o bieżącym kluczu i wartości tablicy i zwiększa wewnętrzny wskaźnik o jeden lub zwraca wartość false, jeśli osiągnął koniec tablicy. Ten kod nie byłby zależny od dwóch tablic mających identyczne klucze lub mające ten sam rodzaj elementów. Pętla kończy się, gdy jedna z dwóch tablic jest zakończona.


3

To zadziałało dla mnie:

$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

Możesz użyć array_merge, aby połączyć dwie tablice, a następnie wykonać iterację po nich.

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

2

Wyjdź z tego ...

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

    array_walk($codes, function ($code,$key,$names){ 
        echo '<option value="' . $code . '">' . $names[$key] . '</option>';
    },$names);
  • lub połączyć

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

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

próbny


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

Zamiast pętli foreach spróbuj tego (tylko wtedy, gdy twoje tablice mają taką samą długość).

$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

Myślę, że możesz zrobić coś takiego:

$ kody = tablica ('tn', 'us', 'fr');

$ names = array ('Tunezja', 'Stany Zjednoczone', 'Francja');

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

Powinien również działać dla tablic asocjacyjnych.


1

Myślę, że najprostszym sposobem jest użycie pętli for w ten sposób:

$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

Twój kod jest niepoprawny, ponieważ foreach tylko dla pojedynczej tablicy:

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

Alternatywnie, zmień to:

<?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()działało świetnie dla mnie podczas łączenia $_POSTwielu wartości z wielu danych wejściowych w formularzu w celu zaktualizowania ilości produktów w koszyku.


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

Teraz możesz użyć $ a dla każdej tablicy ....

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

0

Rozwiązałem problem taki jak twój w ten sposób:

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

Powinieneś spróbować tego dla tablicy putting 2 w pojedynczej pętli foreach Załóżmy, że mam 2 tablice 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

Niewiele tablic można również iterować w ten sposób:

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

mi to pasuje

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.