Hai mảng trong vòng lặp foreach


98

Tôi muốn tạo ra một selectbox bằng cách sử dụng hai mảng, một mảng chứa mã quốc gia và một mảng chứa tên quốc gia.

Đây là một ví dụ:

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

Phương pháp này không hiệu quả với tôi. Bất kỳ đề xuất?

Câu trả lời:


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

Điều đó không hợp lệ.

Bạn có thể muốn một cái gì đó như thế này ...

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

Ngoài ra, sẽ dễ dàng hơn nhiều để làm cho các mã trở thành khóa của $namesmảng của bạn ...

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

hữu ích trong việc phân tích cú pháp các mảng trường biểu mẫu.
Ryu_hayabusa

85

foreach chỉ hoạt động trên một mảng tại một thời điểm.

Theo cách mảng của bạn được cấu trúc, bạn có thể array_combine()đưa chúng thành một mảng các cặp khóa-giá trị sau đó foreachlà một mảng:

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

Hoặc như đã thấy trong các câu trả lời khác, bạn có thể mã hóa cứng một mảng liên kết để thay thế.


Điều này cũng có thể được sử dụng cho ba mảng?
xjshiya

@xjshiya Không, nếu bạn cung cấp cho họ 3 tham số, bạn sẽ nhận được Cảnh báo: array_combine () mong đợi chính xác 2 tham số, 3 đã cho
Julian


6

Sử dụng một mảng kết hợp:

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

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

Tôi tin rằng sử dụng mảng kết hợp là cách tiếp cận hợp lý nhất thay array_combine()vì sử dụng vì khi bạn có một mảng kết hợp, bạn có thể chỉ cần sử dụng array_keys()hoặc array_values()lấy chính xác mảng mà bạn đã có trước đó.


+1 array_combine()đã tạo ra một mảng liên kết, bạn có thể muốn hiểu rõ hơn về việc khởi tạo nó dưới dạng liên kết.
BoltClock

4

array_map có vẻ tốt cho việc này

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

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

Các lợi ích khác là:

  • Nếu một mảng ngắn hơn mảng kia, thì lệnh gọi lại nhận nullcác giá trị để lấp đầy khoảng trống.

  • Bạn có thể sử dụng nhiều hơn 2 mảng để lặp lại.


3

Tại sao không chỉ hợp nhất thành một mảng kết hợp nhiều chiều ? Có vẻ như bạn đang làm sai điều này:

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

trở thành:

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

1
Nó được gọi là mảng kết hợp, không phải mảng đa chiều.
BoltClock

3

Tất cả đã được kiểm tra đầy đủ

3 cách để tạo danh sách thả xuống động từ một mảng.

Thao tác này sẽ tạo menu thả xuống từ một mảng và tự động gán giá trị tương ứng của nó.

Phương pháp # 1 (Mảng bình thường)

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


Phương pháp # 2 (Mảng bình thường)

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


Phương pháp # 3 (Mảng kết hợp)

<?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 ... downvote chưa được gọi. Downvoter, lý do và chăm sóc để xây dựng? Rõ ràng là thực hiện "just cuz". Meh ~
Funk Forty Niner

4
Không phải những thứ này đều giống nhau sao? Tôi không thấy bất kỳ sự khác biệt đáng kể nào ngoài tên của các biến.
Patrick

3

foreach chỉ hoạt động với một mảng duy nhất. Để chuyển qua nhiều mảng, tốt hơn nên sử dụng hàm each () trong vòng lặp while:

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

Mỗi () trả về thông tin về khóa và giá trị hiện tại của mảng và tăng con trỏ bên trong lên một hoặc trả về false nếu nó đã đến cuối mảng. Mã này sẽ không phụ thuộc vào hai mảng có các khóa giống nhau hoặc có cùng một loại phần tử. Vòng lặp kết thúc khi một trong hai mảng kết thúc.


3

Điều này đã làm việc cho tôi:

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

Nó hoạt động, nhưng rõ ràng hơn là có một mảng duy nhất với mã là khóa và tên là giá trị ...
Ferdinand.kraft

2

Bạn có thể sử dụng array_merge để kết hợp hai mảng và sau đó lặp lại chúng.

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

2

Đi ra ngoài...

$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>';
    });
  • Trước PHP 5.3

    array_walk($codes, function ($code,$key,$names){ 
        echo '<option value="' . $code . '">' . $names[$key] . '</option>';
    },$names);
  • hoặc kết hợp

    array_walk(array_combine($codes,$names), function ($name,$code){ 
        echo '<option value="' . $code . '">' . $name . '</option>';
    })
  • trong sự lựa chọn

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

bản giới thiệu


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

Thay vì vòng lặp foreach, hãy thử điều này (chỉ khi các mảng của bạn có cùng độ dài).

$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

Tôi nghĩ rằng bạn có thể làm điều gì đó như:

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

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

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

Nó cũng sẽ hoạt động cho các mảng kết hợp.


1

Tôi nghĩ cách đơn giản nhất là sử dụng vòng lặp for theo cách này:

$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

Mã của bạn như thế này không chính xác vì foreach chỉ dành cho một mảng:

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

Thay thế, Thay đổi cái này:

<?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()rất hiệu quả đối với tôi trong khi kết hợp $_POSTnhiều giá trị từ nhiều đầu vào biểu mẫu để cố gắng cập nhật số lượng sản phẩm trong giỏ hàng.


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

Bây giờ bạn có thể sử dụng $ a cho mỗi mảng ....

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

0

Tôi đã giải quyết một vấn đề như của bạn bằng cách này:

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

Bạn nên thử điều này cho mảng đặt 2 trong vòng lặp foreach singlr Giả sử tôi có 2 Mảng 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

Một số mảng cũng có thể được lặp lại như thế này:

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

nó làm việc cho tôi

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.