Foreach döngüsünde iki dizi


99

selectboxBiri ülke kodlarını ve diğeri ülke adlarını içeren iki dizi kullanarak bir tane oluşturmak istiyorum .

Bu bir örnektir:

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

Bu yöntem benim için işe yaramadı. Baska öneri?

Yanıtlar:


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

Bu geçerli değil.

Muhtemelen böyle bir şey istiyorsun ...

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

Alternatif olarak, kodları $namesdizinizin anahtarı yapmak çok daha kolay olurdu ...

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

form alanı dizilerini ayrıştırmada kullanışlıdır.
Ryu_hayabusa

85

foreach bir seferde yalnızca bir dizi üzerinde çalışır.

Dizinizin yapılandırılma şekline göre, array_combine()bunları bir dizi anahtar-değer çiftine ve sonra foreacho tek diziye ekleyebilirsiniz :

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

Veya diğer yanıtlarda görüldüğü gibi, bunun yerine ilişkilendirilebilir bir diziyi kodlayabilirsiniz.


Bu aynı zamanda üç dizi için de kullanılabilir mi?
xjshiya

@xjshiya Hayır, onlara 3 parametre verirseniz Uyarı alırsınız: array_combine () tam olarak 2 parametre bekler, 3 verilir
Jülyen


6

İlişkilendirilebilir bir dizi kullanın:

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

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

Bir ilişkisel dizi kullanmanın, kullanmaktan ziyade en mantıklı yaklaşım olduğuna inanıyorum, array_combine()çünkü ilişkilendirilebilir bir diziye sahip olduğunuzda, daha önce sahip olduğunuz dizinin aynısını basitçe kullanabilir array_keys()veya array_values()elde edebilirsiniz.


+1 array_combine()zaten ilişkilendirilebilir bir dizi üretir, onu ilişkilendirmeli olarak başlatmak konusunda daha net olmak isteyebilirsiniz .
BoltClock

4

array_map bunun için de iyi görünüyor

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

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

Diğer faydalar:

  • Bir dizi diğerinden daha kısaysa, geri arama nullboşluğu doldurmak için değerleri alır .

  • Yinelemek için 2'den fazla dizi kullanabilirsiniz.


3

Neden sadece çok boyutlu bir ilişkisel dizide birleştirilmiyor? Görünüşe göre bu konuda yanlış gidiyorsun:

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

şu hale gelir:

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

1
Buna ilişkisel dizi denir, çok boyutlu bir dizi değil.
BoltClock

3

Hepsi tamamen test edildi

Bir diziden dinamik bir açılır menü oluşturmanın 3 yolu.

Bu, bir diziden bir açılır menü oluşturacak ve ilgili değeri otomatik olarak atayacaktır.

Yöntem 1 (Normal Dizi)

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


Yöntem 2 (Normal Dizi)

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


Yöntem 3 (İlişkili Dizi)

<?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 ... gereksiz yere olumsuz oy. Olumsuz oy veren, ayrıntılandırmak için sebep ve özen? Açıkça "sadece kuzen" yapıldı. Meh ~
Funk Forty Niner

4
Bunların hepsi aynı şey değil mi? Değişkenlerin isimleri dışında önemli bir fark görmüyorum.
Patrick

3

foreach yalnızca tek bir diziyle çalışır. Birden çok dizide ilerlemek için, bir while döngüsünde each () işlevini kullanmak daha iyidir:

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

each (), dizinin geçerli anahtarı ve değeri hakkında bilgi verir ve dahili işaretçiyi bir artırır veya dizinin sonuna ulaştıysa false döndürür. Bu kod, aynı anahtarlara veya aynı tür öğelere sahip iki diziye bağlı olmayacaktır. Döngü, iki diziden biri bittiğinde sona erer.


3

Bu benim için çalıştı:

$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

İki diziyi birleştirmek ve sonra bunların üzerinde yinelemek için dizi_merge'i kullanabilirsiniz.

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

2

Yürü gitsin...

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

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

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

    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

Foreach döngüsü yerine, bunu deneyin (yalnızca dizileriniz aynı uzunlukta olduğunda).

$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

Sanırım şöyle bir şey yapabilirsiniz:

$ kodlar = array ('tn', 'us', 'fr');

$ isimler = array ('Tunus', 'Amerika Birleşik Devletleri', 'Fransa');

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

İlişkili diziler için de çalışmalıdır.


1

Bence en basit yol, for döngüsünü bu şekilde kullanmak:

$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

Bunun gibi kodunuz yalnızca tek bir dizi için foreach olarak yanlıştır:

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

Alternatif, Şuna değiştirin:

<?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()$_POSTBir alışveriş sepetindeki ürün miktarlarını güncellemek için birden çok form girdisinden birden çok değeri birleştirirken benim için harika çalıştı .


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

Artık her dizi için $ a kullanabilirsiniz ...

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

0

Seninki gibi bir sorunu bu şekilde çözdüm:

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

Bunu singlr foreach döngüsüne 2 dizisi koymak için denemelisiniz Farz edin ki 2 Array 1 var. $ İtem_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

Birkaç dizi de şu şekilde yinelenebilir:

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

benim için çalışıyor

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.