รวมสองอาร์เรย์


91

ฉันมีสองอาร์เรย์ดังนี้:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

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

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

ฉันได้ลองแล้ว แต่กำลังเปลี่ยนคีย์ดั้งเดิม:

$output = array_unique( array_merge( $array1 , $array2 ) );

วิธีแก้ปัญหาใด ๆ

คำตอบ:


165

เพียงใช้:

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

ที่ควรแก้มัน เนื่องจากคุณใช้คีย์สตริงหากคีย์หนึ่งเกิดขึ้นมากกว่าหนึ่งครั้ง (เช่น'44'ในตัวอย่างของคุณ) คีย์หนึ่งคีย์จะเขียนทับคีย์เวิร์ดที่มีชื่อเดียวกัน เนื่องจากในกรณีของคุณทั้งคู่มีค่าเท่ากันอย่างไรก็ตามมันไม่สำคัญและจะลบรายการที่ซ้ำกันออกไปด้วย

อัปเดต: ฉันเพิ่งรู้ว่า PHP ถือว่าสตริงคีย์เป็นตัวเลข (จำนวนเต็ม) และจะทำงานเช่นนี้หมายความว่าอย่างไรที่จะเปลี่ยนหมายเลขคีย์ด้วย ...

วิธีแก้ปัญหาคือการสร้างคีย์ใหม่

$output = array_combine($output, $output);

การปรับปรุงที่ 2: ผมมักจะลืมว่ายังมีผู้ประกอบการ (ตัวหนาเพราะนี้เป็นจริงสิ่งที่คุณกำลังมองหา!: D)

$output = $array1 + $array2;

ทั้งหมดนี้สามารถดูได้ใน: http://php.net/manual/en/function.array-merge.php


5
@KingCrunch - แม้ว่าตัวเลขจะถูกยกมา แต่ก็ไม่ใช่คีย์สตริงดังนั้นดัชนีจะไม่ถูกเก็บรักษาไว้ ตัวอย่าง: ideone.com/I2NFT
Brendan Bullen

1
จริงๆแล้ว ... ก่อนอื่นฉันต้องการพูดถึง "จุดบกพร่อง" แต่ฉันสังเกตเห็นว่าคู่มือพูดถึง "คีย์ตัวเลข" เท่านั้นไม่ใช่ "คีย์จำนวนเต็ม" รู้สึกสับสนเล็กน้อย
KingCrunch

+1 ฉันลืมเกี่ยวกับตัวดำเนินการ! ยอดเยี่ยม (ใส่ส่วนนั้นเป็นตัวหนา!;))
Brendan Bullen

4
ดังนั้น$array1 + $array2เป็นวิธีการแก้สั้นและมีประสิทธิภาพแทนการarray_merge() - array_combine()รวมกัน
Awan

2
คำเตือน! สำหรับอาร์เรย์ที่ไม่$a + $b != array_merge($a, $b)
เชื่อมโยง

33

คุณควรคำนึงถึงสิ่งนั้น $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

ด้วย$ array1 + $ array2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

และด้วย $ array2 + $ array1

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);

25

ใช้งานได้:

$output = $array1 + $array2;

12
ฉันไม่อยากแนะนำสิ่งนี้เพราะมันเป็นพฤติกรรมที่ไม่เข้าใจง่ายเช่น[1,2,3] + [4,5,6] == [1,2,3]
jchook

@jchook มีอะไรแนะนำบ้าง?
Michas

นี่คือสิ่งที่ฉันต้องการขอบคุณ นี่คือเหตุผล: http_build_query(array_merge($array1, $array2))ไม่ได้ผลสำหรับฉันในขณะที่http_build_query($array1 + $array2)ทำ
BarryMode

4

ในการทำเช่นนี้คุณสามารถวนลูปหนึ่งและต่อท้ายอีกอัน:

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

UPDATE: KingCrunch มาพร้อมกับทางออกที่ดีที่สุด :print_r($array1+$array2);


2

หากคุณใช้ PHP 7.4 ขึ้นไปคุณสามารถใช้ตัวดำเนินการกระจาย...ดังตัวอย่างต่อไปนี้จากเอกสาร PHP:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

ทำงานเหมือนใน JavaScript ES6

ดูข้อมูลเพิ่มเติมเกี่ยวกับhttps://wiki.php.net/rfc/spread_operator_for_array


ใช้ไม่ได้กับคำถาม OP มีคีย์สตริงสำหรับอาร์เรย์ (ซึ่งใช้ไม่ได้กับตัวดำเนินการสเปรด) และ OP ต้องการรักษาคีย์ (ตัวดำเนินการกระจายจะโยนคีย์ออกไป) นอกจากนี้ OP ไม่ต้องการให้ซ้ำกัน
martti

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

ฉันไม่คิดว่าตัวดำเนินการการแพร่กระจายเป็นวิธีที่จะไปที่นี่ ใช้คำตอบที่ให้มาแทน$array1 + $array2
martti

ฉันไม่รู้เรื่องนี้! $ouput = $array1 + $array2ฉันหมายความว่าฉันไม่ทราบว่าเราสามารถทำได้ ตอนนี้ฉันได้เรียนรู้สิ่งใหม่ ๆ แล้ว! ขอขอบคุณ!
Student of Science


1

คำเตือน! $ array1 + $ array2เขียนทับคีย์ดังนั้นวิธีแก้ปัญหาของฉัน (สำหรับอาร์เรย์หลายมิติ) คือการใช้array_unique ()

array_unique(array_merge($a, $b), SORT_REGULAR);

ข้อสังเกต:

5.2.10+เปลี่ยนค่าเริ่มต้นของsort_flags back เป็น SORT_STRING

5.2.9 ค่าเริ่มต้นคือ SORT_REGULAR

5.2.8-ค่าเริ่มต้นคือ SORT_STRING

มันทำงานได้อย่างสมบูรณ์ หวังว่ามันจะช่วยเหมือนกัน


1
array_merge()ไม่ได้รักษาคีย์ไว้ อาร์เรย์ที่สร้างขึ้นโดยมีการจัดทำดัชนี 0
HPierce

@hierce ดีในกรณีการเพิ่มอาร์เรย์หลายมิติข้อมูลบางอย่างจะสูญหายไปโดยใช้+ไฟล์. ดูที่: PHPFiddle , $ b [0] จะหายไป ...
Norman Edance

1

วิธีใหม่ในการใช้php7.4คือตัวดำเนินการ Spread [... ]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

ตัวดำเนินการสเปรดควรมีประสิทธิภาพที่ดีกว่า array_merge

ข้อได้เปรียบที่สำคัญของตัวดำเนินการ Spread คือรองรับวัตถุที่สามารถข้ามผ่านได้ในขณะที่ฟังก์ชัน array_merge รองรับเฉพาะอาร์เรย์เท่านั้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.