Dua larik dalam perulangan foreach


98

Saya ingin membuat selectboxmenggunakan dua larik, satu berisi kode negara dan satu lagi berisi nama negara.

Ini contohnya:

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

Metode ini tidak berhasil untuk saya. Ada saran?

Jawaban:


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

Itu tidak valid.

Anda mungkin menginginkan sesuatu seperti ini ...

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

Sebagai alternatif, akan jauh lebih mudah untuk membuat kode kunci dari $namesarray Anda ...

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

berguna dalam mengurai array bidang formulir.
Ryu_hayabusa

85

foreach beroperasi hanya pada satu larik pada satu waktu.

Cara susunan Anda terstruktur, Anda dapat menyusunnya array_combine()menjadi larik pasangan nilai kunci lalu foreachlarik tunggal itu:

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

Atau seperti yang terlihat di jawaban lain, Anda dapat melakukan hardcode array asosiatif sebagai gantinya.


Bisakah ini juga digunakan untuk tiga larik?
xjshiya

@xjshiya Tidak, jika Anda memberi mereka 3 parameter, Anda akan mendapatkan Peringatan: array_combine () mengharapkan tepat 2 parameter, 3 diberikan
Julian


6

Gunakan array asosiatif:

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

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

Saya percaya bahwa menggunakan array asosiatif adalah pendekatan yang paling masuk akal dibandingkan dengan menggunakan array_combine()karena begitu Anda memiliki array asosiatif, Anda cukup menggunakan array_keys()atau array_values()mendapatkan array yang sama persis dengan yang Anda miliki sebelumnya.


+1 array_combine()sudah menghasilkan larik asosiatif, Anda mungkin ingin lebih jelas tentang memulainya sebagai asosiatif.
BoltClock

4

array_map tampaknya bagus untuk ini juga

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

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

Manfaat lainnya adalah:

  • Jika satu array lebih pendek dari yang lain, callback menerima nullnilai untuk mengisi celah tersebut.

  • Anda dapat menggunakan lebih dari 2 array untuk melakukan iterasi.


3

Mengapa tidak mengonsolidasi menjadi array asosiatif multi-dimensi ? Sepertinya Anda melakukan kesalahan ini:

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

menjadi:

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

1
Ini disebut array asosiatif, bukan array multidimensi.
BoltClock

3

Semuanya teruji sepenuhnya

3 cara untuk membuat dropdown dinamis dari array.

Ini akan membuat menu dropdown dari array dan secara otomatis menetapkan nilainya masing-masing.

Metode # 1 (Array Normal)

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


Metode # 2 (Array Normal)

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


Metode # 3 (Array Asosiatif)

<?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 ... suara negatif tidak beralasan. Downvoter, alasan dan perhatian untuk menguraikan? Jelas dilakukan "just cuz". Meh ~
Funk Forty Niner

4
Bukankah ini semua sama? Saya tidak melihat perbedaan signifikan selain nama variabel.
Patrick

3

foreach hanya bekerja dengan satu larik. Untuk melangkah melalui beberapa array, lebih baik menggunakan fungsi each () dalam loop sementara:

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

each () mengembalikan informasi tentang kunci dan nilai saat ini dari larik dan menambah penunjuk internal sebanyak satu, atau mengembalikan salah jika telah mencapai akhir larik. Kode ini tidak akan bergantung pada dua larik yang memiliki kunci identik atau memiliki jenis elemen yang sama. Perulangan berakhir ketika salah satu dari dua larik selesai.


3

Ini berhasil untuk saya:

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

Ini berfungsi, tetapi lebih jelas untuk memiliki satu larik dengan kode sebagai kunci dan nama sebagai nilai ...
Ferdinand.kraft

2

Anda dapat menggunakan array_merge untuk menggabungkan dua array dan kemudian mengulanginya.

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

2

Keluarkan ...

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

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

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

    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

Alih-alih foreach loop, coba ini (hanya jika array Anda memiliki panjang yang sama).

$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

Saya pikir Anda bisa melakukan sesuatu seperti:

$ kode = larik ('tn', 'us', 'fr');

$ names = array ('Tunisia', 'United States', 'France');

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

Ini juga harus bekerja untuk array asosiatif.


1

Saya pikir cara paling sederhana adalah menggunakan for loop dengan cara ini:

$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

Kode Anda seperti ini salah karena foreach hanya untuk larik tunggal:

<?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, Ubah ini:

<?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()bekerja dengan sangat baik untuk saya saat menggabungkan $_POSTbeberapa nilai dari beberapa masukan formulir dalam upaya untuk memperbarui jumlah produk di keranjang belanja.


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

Sekarang Anda dapat menggunakan $ a untuk setiap array ....

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

0

Saya memecahkan masalah seperti Anda dengan cara ini:

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

Anda harus mencoba ini untuk menempatkan 2 array di loop foreach singlr Misalkan saya memiliki 2 Array 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

Beberapa larik juga bisa diiterasi seperti ini:

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

itu berhasil untuk saya

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.