PHP: ผสานสองอาร์เรย์ในขณะที่เก็บกุญแจแทนการทำดัชนีใหม่?


255

ฉันจะผสานสองอาร์เรย์ (หนึ่งคู่กับ string => value คู่และอีกคู่กับ int => value คู่) ในขณะที่รักษาสตริง / int คีย์? ไม่มีใครเลยที่จะทับซ้อนกัน (เพราะมีเพียงสตริงและอื่น ๆ ที่มีจำนวนเต็มเท่านั้น)

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

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
มันแปลก: ตามหน้าเอกสาร PHP, array_merge ไม่ควรทำอย่างนั้น คีย์สตริงเป็นจริงการแสดงสตริงของจำนวนเต็มหรือไม่
owenmarshall

array_merge กำลังทำดัชนีอาร์เรย์ที่สองของฉันอีกครั้ง กล่าวคือ มันเปลี่ยนอาเรย์จากarray( 123 => "VALUE123" )เป็นarray( 0 => "VALUE123" )
การ์เร็ตต์

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

อาจจะไม่ 2 ปีที่ผ่านมา แต่ในปี 2012 เอกสารมีความชัดเจนในจุดนี้
cartbeforehorse

ที่จริงแล้วเอกสารยังไม่ชัดเจน "ตัวเลข" รวมสตริงด้วยตัวเลขทั้งหมด (PHP 5.3.3) assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein

คำตอบ:


557

คุณสามารถ 'เพิ่ม' อาร์เรย์ได้ง่ายๆ:

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
ระวังให้มากด้วย! ตัวดำเนินการ + ไม่ได้เป็นการเพิ่ม แต่เป็นการรวมกัน ถ้ากุญแจที่ไม่ทับซ้อนกันแล้วทั้งหมดเป็นสิ่งที่ดี แต่ถ้าพวกเขาทำ ...
GordonM

3
เพียงแค่ว้าว - คุณบันทึกถังของบรรทัดของรหัสเกือบสามปี
Stephen O'Flynn

85
ในกรณีที่ทุกคนสงสัยว่าจะเกิดอะไรขึ้นถ้าพวกเขาทับซ้อนกัน : php.net: "โอเปอเรเตอร์ + คืนอาร์เรย์ขวามือต่อท้ายอาร์เรย์ซ้ายสำหรับคีย์ที่มีอยู่ในทั้งสองอาร์เรย์จะใช้องค์ประกอบจากอาร์เรย์ซ้ายมือและองค์ประกอบที่ตรงกันจากด้านขวา มือสองจะถูกละเว้น "
Flion

2
@Flion มันซับซ้อนกว่านั้น เมื่อใช้ '+' ฉันเพิ่งเพิ่มอาร์เรย์ย่อยสองชุดพร้อมองค์ประกอบที่มีคีย์ทั่วไปและคีย์ย่อย: ค่าได้เพิ่มเข้าไปแล้ว! 100000 => อาร์เรย์ (ขนาด = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => อาร์เรย์ (ขนาด = 1) 2 => int 30 ผล: 100000 => อาร์เรย์ (ขนาด = 3) 1 => int 128 2 => int 86 3 => int 7 โดยทั่วไปการเพิ่ม [2 => 56] + [2 => 30] ไม่ได้แทนที่ค่า แต่เพิ่มมันและกลายเป็น [2 => 86]
Dario Fumagalli

1
@DarioFumagalli ฉันไม่รู้ว่าฉันเข้าใจผิดหรือว่ามันเพิ่งเปลี่ยนไปตั้งแต่ปี 2559 แต่ ณ จุดนี้การดำเนินการprint_r([2 => 56] + [2 => 30]);จะเกิดArray ( [2] => 56 )ขึ้น ดังนั้นมันจะรักษาด้านซ้ายตามที่ระบุไว้ นี้จะเป็นของ PHP 7.1.19 วิ่งบนrepl.it
Charles Wood

62

พิจารณาว่าคุณมี

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

การทำ$merge = $replacement + $replaced;จะส่งออก:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

อาร์เรย์แรกจากผลรวมจะมีค่าในผลลัพธ์สุดท้าย

การทำ$merge = $replaced + $replacement;จะส่งออก:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[thumbsup]] ในรายการนี้
Jhourlad Estrella

21
ในการสรุปเมื่อเพิ่ม 2 อาร์เรย์ค่าจากค่าการแทนที่แรกจากวินาที
Dziamid

1
ฉันคิดว่าอันที่สองจะแทนที่อันแรก :)
Asim KT

1
เผง $allValues += $newValues;นั่นเป็นเหตุผลที่ผมไม่สามารถใช้งาน
MarthyM

การทำ$merge = $replacement + $replaced;จะออก:Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma

24

ในขณะที่คำถามนี้ค่อนข้างเก่าฉันแค่ต้องการเพิ่มความเป็นไปได้อีกอย่างในการผสานขณะที่ยังคงเป็นกุญแจ

นอกเหนือจากการเพิ่มคีย์ / ค่าอาร์เรย์ที่มีอยู่โดยใช้สัญญาณที่คุณสามารถทำ+array_replace

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

ผลลัพธ์จะเป็น:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

คีย์เดียวกันจะถูกเขียนทับโดยอาเรย์หลัง
นอกจากนี้ยังมีการarray_replace_recursiveทำเช่นนี้สำหรับ subarrays ด้วย

ตัวอย่างสดใน 3v4l.org


3

สองอาร์เรย์สามารถเพิ่มหรือสหภาพได้อย่างง่ายดายโดยไม่ต้อง chaning การจัดทำดัชนีเดิมโดย+ผู้ประกอบการ สิ่งนี้จะช่วยได้มากใน laravel และ codeigniter เลือกดรอปดาวน์

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

ผลลัพธ์จะเป็น:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

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