PHP รวมอาร์เรย์ที่เชื่อมโยงสองอาร์เรย์ไว้ในอาร์เรย์เดียว


87
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

ฉันต้องการอาร์เรย์ใหม่ที่รวมทั้งหมดเข้าด้วยกันนั่นคือมันจะเป็น

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

วิธีที่ดีที่สุดในการทำคืออะไร?

ขออภัยฉันลืมรหัสจะไม่จับคู่กัน แต่ในทางเทคนิคแล้วชื่อสามารถทำได้ แต่ไม่น่าจะเป็นไปได้และพวกเขาทั้งหมดจะต้องอยู่ในรายการเดียว ฉันดูที่ array_merge แต่ไม่แน่ใจว่าเป็นวิธีที่ดีที่สุดหรือไม่ นอกจากนี้คุณจะทดสอบหน่วยนี้อย่างไร


5
ดูเหมือนว่าคุณอาจกำลังมองหา array_merge
Corbin

ฉันคิดว่าวิธีที่ดีที่สุดถ้าคุณรู้ว่าคีย์ต่างกันทั้งหมดคือใช้ตัวดำเนินการ + =: $ array1 + = $ array2; สิ่งนี้ต่อท้ายองค์ประกอบทั้งหมดของ $ array2 ต่อท้าย $ array1
David Spector

คำตอบ:


130

array_merge() มีประสิทธิภาพมากกว่า แต่มีสองตัวเลือก:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
array_merge มีประโยชน์อย่างไรกับการใช้ตัวดำเนินการ
jsteinmann

38
Array Union (+): ตัวดำเนินการ + ต่อท้ายองค์ประกอบของคีย์ที่เหลือจากอาร์เรย์ทางขวาไปยังมือซ้ายในขณะที่คีย์ที่ซ้ำกันจะไม่ถูกเขียนทับ array_merge (): หากอาร์เรย์อินพุตมีคีย์สตริงเหมือนกันค่าที่ตามมาของคีย์นั้นจะเขียนทับค่าก่อนหน้า อย่างไรก็ตามหากอาร์เรย์มีคีย์ตัวเลขค่าในภายหลังจะไม่เขียนทับค่าเดิม แต่จะถูกต่อท้าย หากอาร์เรย์ทั้งหมดมีเฉพาะคีย์ตัวเลขอาร์เรย์ผลลัพธ์จะได้รับคีย์ที่เพิ่มขึ้นโดยเริ่มจากศูนย์
Samuel Cook

13
นอกจากนี้ควรสังเกตด้วยว่าarray_mergeจะคืนค่า NULL หากอาร์กิวเมนต์ใด ๆ เป็นโมฆะ
SeanWM

4
หากมีคีย์จำนวนเต็มคีย์เหล่านั้นจะถูกเปลี่ยนเป็นคีย์จำนวนเต็มโดยเริ่มจาก 0 โปรดใช้ความระมัดระวังกับ array_merge ใช้ foreach loop ดีกว่าเพื่อทำสิ่งที่คุณพยายามทำ
user2850305

24

array_merge()ตรวจสอบ

$array3 = array_merge($array1, $array2);

22
@SudhanshuSaxena ถือว่าฉันเป็นคนแรกที่โพสต์ฉันไม่เห็นว่ามันจะเป็นคำตอบซ้ำได้อย่างไร
Brad

10

นอกจากนี้ยังมีarray_replaceที่อาร์เรย์ดั้งเดิมถูกแก้ไขโดยอาร์เรย์อื่น ๆ ที่รักษาการเชื่อมโยงคีย์ => ค่าโดยไม่ต้องสร้างคีย์ซ้ำ

  • คีย์เดียวกันในอาร์เรย์อื่น ๆ จะทำให้ค่าเขียนทับอาร์เรย์เดิม
  • คีย์ใหม่บนอาร์เรย์อื่น ๆ จะถูกสร้างขึ้นบนอาร์เรย์เดิม

1
นี่คือคำตอบที่ถูกต้อง array_merge จะไม่ทำงานหากคุณมีคีย์ตัวเลข (คีย์ทั้งหมดจะถูกแปลงเป็นดัชนีที่สอดคล้องกัน)
Dmitry

3

ฉันใช้เสื้อคลุมรอบ array_merge เพื่อจัดการกับความคิดเห็นของ SeanWM เกี่ยวกับอาร์เรย์ว่าง บางครั้งฉันก็ต้องการกำจัดรายการที่ซ้ำกัน ฉันมักต้องการรวมอาร์เรย์หนึ่งเข้ากับอีกอาร์เรย์แทนที่จะสร้างอาร์เรย์ใหม่ สิ่งนี้จะกลายเป็น:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

หากเป็นอาร์เรย์ที่เป็นตัวเลข แต่ไม่ใช่อาร์เรย์ที่เชื่อมโยงตามลำดับคุณต้องใช้ array_replace


0

ฉันสะดุดกับคำถามนี้ที่พยายามระบุวิธีที่สะอาดในการเข้าร่วมอาร์เรย์ Assoc สองอาร์เรย์

ฉันพยายามเข้าร่วมโต๊ะสองโต๊ะที่ไม่ได้มีความสัมพันธ์ซึ่งกันและกัน

นี่คือสิ่งที่ฉันคิดขึ้นสำหรับ PDO Query ที่เข้าร่วมสองตาราง Samuel Cook คือสิ่งที่ระบุวิธีแก้ปัญหาสำหรับฉันด้วยarray_merge()+1 ให้กับเขา

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

บางทีนี่อาจจะช่วยคนอื่นได้


0

อัปเดต เป็นเพียงบันทึกย่ออย่างที่ฉันเห็นว่ามันดูโง่มากและไม่มีประโยชน์กับ PHP บริสุทธิ์เพราะใช้array_mergeงานได้ดี แต่ลองใช้กับไดรเวอร์ PHP MongoDB ก่อนที่คุณจะรีบลงคะแนน เพื่อนคนนั้นจะเพิ่มดัชนีไม่ว่าด้วยเหตุผลใดก็ตามและจะทำลายวัตถุที่ผสาน ด้วยฟังก์ชั่เล็ก ๆ น้อย ๆ array_mergeของฉันไร้เดียงสาผสานออกมาตรงทางที่มันควรจะมีแบบดั้งเดิม


ฉันรู้ว่ามันเป็นคำถามที่เก่า แต่ฉันต้องการที่จะเพิ่มมากขึ้นกรณีหนึ่งที่ผมมีเร็ว ๆ นี้กับ MongoDB คำสั่งคนขับและไม่มีarray_merge, array_replaceมิได้array_pushทำงาน ฉันมีโครงสร้างที่ซับซ้อนเล็กน้อยของวัตถุที่ห่อเป็นอาร์เรย์ในอาร์เรย์:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

และฉันต้องรวมเข้าด้วยกันโดยรักษาโครงสร้างเดียวกันดังนี้:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

ทางออกที่ดีที่สุดที่ฉันคิดขึ้นมาคือ:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.