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?

medk
sumber

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

BoltClock
sumber
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
25

Gunakan array_combine()untuk memadukan larik bersama-sama dan mengulangi hasilnya.

$countries = array_combine($codes, $names);
Ignacio Vazquez-Abrams
sumber
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.

Jacob Relkin
sumber
+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.

ankabot
sumber
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');
Jakub
sumber
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>';
?>
Funk Forty Niner
sumber
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.

Perseptor II
sumber
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>";
}
delAmux
sumber
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);
Haider Ali
sumber
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

oLinkWebDevelopment
sumber
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
sumber
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
  }
}
fchan
sumber
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.

pashri
sumber
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>';
}
SeReGa
sumber
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++;
        }

?>
Pangkalan Salju
sumber
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.

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