สองอาร์เรย์ใน foreach loop


100

ฉันต้องการสร้างselectboxอาร์เรย์โดยใช้สองอาร์เรย์โดยหนึ่งมีรหัสประเทศและอีกอันที่มีชื่อประเทศ

นี่คือตัวอย่าง:

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

วิธีนี้ไม่ได้ผลสำหรับฉัน ข้อเสนอแนะใด ๆ ?

คำตอบ:


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

ไม่ถูกต้อง

คุณคงต้องการอะไรแบบนี้ ...

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

หรืออีกวิธีหนึ่งคือการทำให้รหัสเป็นคีย์ของ$namesอาร์เรย์ของคุณง่ายขึ้นมาก...

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

มีประโยชน์ในการแยกวิเคราะห์อาร์เรย์ฟิลด์ของฟอร์ม
Ryu_hayabusa

85

foreach ทำงานบนอาร์เรย์เพียงหนึ่งครั้ง

วิธีจัดโครงสร้างอาร์เรย์ของคุณคุณสามารถarray_combine()จัดเรียงเป็นอาร์เรย์ของคู่คีย์ - ค่าจากนั้นforeachอาร์เรย์เดียว:

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

หรือตามที่เห็นในคำตอบอื่น ๆ คุณสามารถฮาร์ดโค้ดอาร์เรย์เชื่อมโยงแทนได้


สิ่งนี้สามารถใช้กับสามอาร์เรย์ได้หรือไม่
xjshiya

@xjshiya ไม่ถ้าคุณให้พารามิเตอร์ 3 ตัวคุณจะได้รับคำเตือน: array_combine () คาดว่าจะมี 2 พารามิเตอร์ให้ 3 ตัว
Julian


6

ใช้อาร์เรย์เชื่อมโยง:

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

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

ฉันเชื่อว่าการใช้อาร์เรย์แบบเชื่อมโยงเป็นวิธีการที่เหมาะสมที่สุดเมื่อเทียบกับการใช้array_combine()เพราะเมื่อคุณมีอาร์เรย์ที่เชื่อมโยงแล้วคุณสามารถใช้array_keys()หรือarray_values()เพื่อให้ได้อาร์เรย์เดียวกันกับที่คุณมี


+1 array_combine()สร้างอาร์เรย์ที่เชื่อมโยงแล้วคุณอาจต้องการความชัดเจนยิ่งขึ้นเกี่ยวกับการเริ่มต้นเป็นเชื่อมโยง
BoltClock

4

array_map ก็ดูเหมือนจะดีเช่นกัน

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

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

ประโยชน์อื่น ๆ ได้แก่ :

  • หากอาร์เรย์หนึ่งสั้นกว่าอีกอาร์เรย์การเรียกกลับจะรับnullค่าเพื่อเติมเต็มในช่องว่าง

  • คุณสามารถใช้อาร์เรย์มากกว่า 2 อาร์เรย์เพื่อวนซ้ำได้


3

ทำไมไม่รวมเป็นอาร์เรย์เชื่อมโยงหลายมิติ ? ดูเหมือนว่าคุณจะผิดพลาด:

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

กลายเป็น:

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

1
เรียกว่าอาร์เรย์เชื่อมโยงไม่ใช่อาร์เรย์หลายมิติ
BoltClock

3

foreach ใช้งานได้กับอาร์เรย์เดียวเท่านั้น หากต้องการก้าวผ่านหลายอาร์เรย์ควรใช้ฟังก์ชัน each () ใน while loop:

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

each () ส่งคืนข้อมูลเกี่ยวกับคีย์ปัจจุบันและค่าของอาร์เรย์และเพิ่มตัวชี้ภายในทีละตัวหรือส่งกลับค่าเท็จหากถึงจุดสิ้นสุดของอาร์เรย์ รหัสนี้จะไม่ขึ้นอยู่กับอาร์เรย์ทั้งสองที่มีคีย์เหมือนกันหรือมีองค์ประกอบประเภทเดียวกัน ลูปจะสิ้นสุดลงเมื่อหนึ่งในสองอาร์เรย์เสร็จสิ้น


3

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

$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

คุณสามารถใช้ array_merge เพื่อรวมอาร์เรย์สองอาร์เรย์แล้วทำซ้ำ

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

2

ทั้งหมดผ่านการทดสอบอย่างเต็มที่

3 วิธีในการสร้างรายการแบบเลื่อนลงแบบไดนามิกจากอาร์เรย์

สิ่งนี้จะสร้างเมนูแบบเลื่อนลงจากอาร์เรย์และกำหนดค่าตามลำดับโดยอัตโนมัติ

วิธี # 1 (อาร์เรย์ปกติ)

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


วิธีที่ # 2 (อาร์เรย์ปกติ)

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


วิธีที่ # 3 (Associative Array)

<?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
หืม ... ไม่ได้ลงคะแนนสำหรับ. ผู้โหวตให้เหตุผลและใส่ใจที่จะอธิบายอย่างละเอียด? เห็นได้ชัดว่า "เพียงแค่ cuz" Meh ~
Funk Forty Niner

4
ทั้งหมดนี้ไม่ใช่สิ่งเดียวกันหรือ? ฉันไม่เห็นความแตกต่างอย่างมีนัยสำคัญนอกเหนือจากชื่อของตัวแปร
Patrick

2

เดินออกไป ...

$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

    array_walk($codes, function ($code,$key,$names){ 
        echo '<option value="' . $code . '">' . $names[$key] . '</option>';
    },$names);
    
  • หรือรวมกัน

    array_walk(array_combine($codes,$names), function ($name,$code){ 
        echo '<option value="' . $code . '">' . $name . '</option>';
    })
    
  • ในการเลือก

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

การสาธิต


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 loop ให้ลองทำเช่นนี้ (เฉพาะเมื่ออาร์เรย์ของคุณมีความยาวเท่ากัน)

$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

ฉันคิดว่าคุณสามารถทำสิ่งต่างๆเช่น:

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

$ names = array ('ตูนิเซีย', 'สหรัฐอเมริกา', 'ฝรั่งเศส');

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

นอกจากนี้ยังควรใช้กับอาร์เรย์ที่เชื่อมโยงกัน


1

ฉันคิดว่าวิธีที่ง่ายที่สุดคือใช้ for loop ด้วยวิธีนี้:

$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

รหัสของคุณเช่นนี้ไม่ถูกต้องเนื่องจาก foreach สำหรับอาร์เรย์เดี่ยวเท่านั้น:

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

ทางเลือกเปลี่ยนเป็น:

<?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()ใช้งานได้ดีสำหรับฉันในขณะที่รวม$_POSTค่าหลายค่าจากอินพุตหลายรูปแบบเพื่อพยายามอัปเดตปริมาณผลิตภัณฑ์ในตะกร้าสินค้า


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

ตอนนี้คุณสามารถใช้ $ a สำหรับแต่ละอาร์เรย์ ....

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

0

ฉันแก้ไขปัญหาเช่นเดียวกับคุณด้วยวิธีนี้:

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

คุณควรลองสิ่งนี้สำหรับการวางอาร์เรย์ 2 ตัวใน singlr foreach loop สมมติว่าฉันมี 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

อาร์เรย์ไม่กี่อาร์เรย์สามารถทำซ้ำได้เช่นนี้:

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

มันได้ผลสำหรับฉัน

$counter = 0;
foreach($codes as $code)
{
$codes_array[$counter]=$code;
$counter++;
}
$counter = 0;
foreach($names as $name)
{
echo $codes_array[$counter]."and".$name;
$counter++;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.