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?

medk
źródło

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',
   ...
);
Alex
źródło
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ą.

BoltClock
źródło
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
25

Służy array_combine()do łączenia tablic ze sobą i iteracji wyniku.

$countries = array_combine($codes, $names);
Ignacio Vazquez-Abrams
źródło
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.

Jacob Relkin
źródło
+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.

ankabot
źródło
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');
Kuba
źródło
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>';
?>
Funk Forty Niner
źródło
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.

PerceptorII
źródło
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>";
}
delAmux
źródło
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);
Haider Ali
źródło
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

oLinkWebDevelopment
źródło
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
źródło
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
  }
}
fchan
źródło
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.

pashri
źródło
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>';
}
SeReGa
źródło
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++;
        }

?>
Podstawy śnieżne
źródło
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.

Calin Rusu
źródło
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]
....
}
Gvice
źródło
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 />";
}
Ulugov
źródło
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 `
JADAV AKASH
źródło
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,
    );
  }
Тарас Костюк
źródło
-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++;
}
mcjarod
źródło