ผู้ประกอบการ + สำหรับอาร์เรย์ใน PHP?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

อะไร+หมายถึงอาร์เรย์ใน PHP?


5
ผมสังเกตเห็นคำถามของคุณได้และคำตอบที่ได้รับการยอมรับได้+= +จากการทดสอบของฉันพวกเขาดูเหมือนจะทำงานเหมือนกัน
user151841

7
เอกสารผลรวมมันได้สวยดี
artfulrobot


@ RobbieAverill - นี่คือคำถามที่คำถามอ้างอิงหมายถึง ดังนั้นหากสิ่งใดก็ตามที่คำถามอ้างอิงซ้ำกัน
icc97

2
มีใครอีกบ้างที่ทำให้ตกใจเล็กน้อยว่าเรื่องพื้นฐานในการต่อเรียงอาร์เรย์ต้องทำผ่านarray_merge? มันเหมือนกับว่าอาร์เรย์เป็นค่าเริ่มต้นของการเชื่อมโยงและอาร์เรย์ที่เป็นตัวเลขเป็นพลเมืองชั้นสอง
icc97

คำตอบ:


271

ข้อความจากคู่มือ PHP เกี่ยวกับผู้ปฏิบัติงานด้านภาษา

ตัวดำเนินการ + ส่งคืนอาร์เรย์ทางขวาที่ผนวกเข้ากับอาร์เรย์ด้านซ้าย สำหรับคีย์ที่มีอยู่ในทั้งสองอาร์เรย์องค์ประกอบจากอาร์เรย์ด้านซ้ายจะถูกนำมาใช้และองค์ประกอบที่ตรงกันจากอาร์เรย์ด้านขวาจะถูกละเว้น

ดังนั้นหากทำ

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

คุณจะได้รับ

Array
(
    [0] => one   // preserved from $array1 (left-hand array)
    [1] => two   // preserved from $array1 (left-hand array)
    [foo] => bar // preserved from $array1 (left-hand array)
    [2] => five  // added from $array2 (right-hand array)
)

ดังนั้นตรรกะของ+เทียบเท่ากับตัวอย่างต่อไปนี้:

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

หากคุณมีความสนใจในรายละเอียดของการดำเนินการระดับหัว C ถึง


โปรดทราบว่า+จะแตกต่างจากวิธีการarray_merge()รวมอาร์เรย์:

print_r(array_merge($array1, $array2));

จะให้คุณ

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => baz // overwritten from $array2
    [2] => three // appended from $array2
    [3] => four  // appended from $array2
    [4] => five  // appended from $array2
)

ดูหน้าเชื่อมโยงสำหรับตัวอย่างเพิ่มเติม


1
@Pacerier PHP ที่ผลิตโดย php.net ไม่มีสเปคที่เป็นทางการ แต่ทั้งคู่+และarray_mergeเรียกzend_hash_mergeภายใต้ประทุน สิ่งนี้เป็นสิ่งที่คาดหวังเนื่องจากใน PHP อาร์เรย์จะถูกใช้งานเป็นแผนที่แฮชสั่ง
บิชอป

1
@Pacerier เอกสารออนไลน์ของ php.net นั้นใกล้เคียงกับข้อกำหนดมากที่สุด แต่ IMO เอกสารเหล่านั้นไม่ตรงกับข้อมูลจำเพาะจริง: เอกสารเหล่านั้นจะถูกอัปเดตหลังจากเขียนโค้ด สองพวกเขาไม่ได้เขียนเพื่อให้ครอบคลุมทุกการใช้งานพิเศษ
บิชอป

14
พฤติกรรมของ PHP +และarray_mergeวิปริตและไม่ได้ใช้งานง่าย มันเป็นวิธีที่ตรงกันข้ามกับสิ่งที่การอ่านภาษาอังกฤษธรรมดาจะบอกให้คุณรู้ว่า 'เพิ่ม' หรือ 'รวม' อาร์เรย์จะทำ ภาษา / ไลบรารีอื่น ๆ ใช้+เพื่อเชื่อมโยงรายการ (เช่นใน Python) และฟังก์ชั่น "ผสาน" เพื่อเพิ่มคู่คีย์ / ค่าจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง (เช่นในบ้านพักอาศัย) แต่ใน PHP มันเป็นอีกทางหนึ่ง array_mergeสามารถใช้สำหรับการเรียงลำดับรายการที่มีลักษณะคล้ายกัน แต่+ไม่สามารถใช้ร่วมกันได้ ซึ่งแตกต่างจากarray_merge, +เสมอทำการดำเนินการที่จะถูกเรียกว่า "ผสาน" ในภาษาอื่น ๆ
Mark Amery

1
@ icc97 เป็น HashMaps เท่านั้น ดูnikic.github.io/2014/12/22/…
Gordon

2
ฉันพยายามส่งบั๊กเพื่อดูว่าarray_concatสามารถสร้างนามแฝงได้array_mergeหรือไม่
icc97

18

ตัวอย่างที่ดีที่สุดที่ฉันพบสำหรับการใช้นี้อยู่ในอาร์เรย์การกำหนดค่า

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

$default_varsเป็นมันแสดงให้เห็นเป็นอาร์เรย์สำหรับเป็นค่าเริ่มต้น อาร์เรย์จะเขียนทับค่าที่กำหนดไว้ใน$user_vars $default_varsค่าใด ๆ ที่ขาดหายไปในตอนนี้เริ่มต้นจาก$user_vars vars$default_vars

นี่จะprint_rเป็น:

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

ฉันหวังว่านี่จะช่วยได้!


6

โอเปอเรเตอร์นี้ใช้เวลารวมกันของสองอาร์เรย์ (เหมือนกับ array_merge ยกเว้นว่ามีคีย์ที่ซ้ำกัน array_merge ถูกเขียนทับ)

เอกสารสำหรับผู้ประกอบการอาร์เรย์พบที่นี่


1
คำเตือนสำหรับผู้เริ่มต้นที่นี่ผลลัพธ์ของการดำเนินการเป็นโมฆะหากหนึ่งในอาร์เรย์ใดเป็นโมฆะโมฆะบางคนอาจไม่สนใจสมมติฐานนี้เนื่องจากเป็นการดำเนินการแบบรวมผลลัพธ์จะเป็นอาร์เรย์ที่เหมาะสม (ไม่เป็นโมฆะ) หากหนึ่งในนั้นเป็นโมฆะ แต่ที่ถือเป็นจริงถ้าหนึ่งในอาร์เรย์เป็นที่ว่างเปล่าอาร์เรย์
Sandeepan Nath

ดังนั้นตามแนวปฏิบัติที่ดีฉันคิดว่าเราควรเริ่มต้นอาร์เรย์อินพุตเป็นอาร์เรย์ว่าง พวกคุณพูดว่าอะไร
Sandeepan Nath

5

ระวังด้วยปุ่มตัวเลขหากพวกเขาควรจะเก็บรักษาไว้หรือถ้าคุณไม่ต้องการที่จะสูญเสียอะไร

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

สหภาพ

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

ผสาน

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)

3

+ผู้ประกอบการผลิตผลเช่นเดียวกับarray_replace () อย่างไรก็ตามเนื่องจากอาร์กิวเมนต์ของโอเปอเรเตอร์กลับด้านการเรียงลำดับของอาร์เรย์ผลลัพธ์อาจแตกต่างกัน

ขยายตัวอย่างอื่นจากหน้านี้:

$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order

เอาท์พุท:

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => bar // preserved from $array1
    [2] => five  // added from $array2
)
Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [2] => five  // added from $array2
    [foo] => bar // preserved from $array1
)

เป็นคำสั่งของ+การรับประกันโดยรายละเอียดหรือไม่ เกี่ยวกับarray_replaceอะไร
Pacerier

1
  1. Array plus operation ใช้อาร์เรย์ทั้งหมดเป็นอาร์เรย์ assoc
  2. เมื่อคีย์ขัดแย้งกันระหว่างบวกค่าซ้าย (ก่อนหน้า) จะถูกเก็บไว้

ฉันโพสต์โค้ดด้านล่างเพื่อทำให้สิ่งต่าง ๆ ชัดเจน

$a + $b = array_plus($a, $b)

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}

การรันโค้ดของ @ Tamlyn ดูเหมือนจะพิสูจน์ว่าการเรียกร้องของคุณ"อาร์เรย์บวกการดำเนินการกับอาร์เรย์ทั้งหมดเป็นอาร์เรย์ assoc"นั้นผิด
Pacerier

@Pacerier คีย์นั้นอาจเป็นจำนวนเต็มเช่นกัน
Hitesh


-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

Array ([0] => ตัวอย่าง [1] => ทดสอบ)


1
เธรดนี้กล่าวถึงสองสามครั้งว่า array_merge () ไม่สอดคล้องกันอย่างไร
doublejosh

@doublejosh, "สอดคล้องกัน"? ความหมาย?
Pacerier

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