iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0

用 + 合併陣列

+ 作為合併陣列,你要注意的是 + , it does not append or merge.

你以為的 + ,不是 +

如果覺得合併陣列使用 + ,就能將兩個陣列合併在一起,你可能會失望.
我以為 [1]+[2] output [1,2],但是 output [1]
我以為的 + 在陣列是合併的效果,例如:

<?php
$a = [1, 2, 3];
$b = [5, 6, 7];
$c = $a + $b;
return $c;

// 我以為的      $c: [1, 2, 3, 5, 6, 7]
// 實際拿到的    $c: [1, 2, 3]

+ 的迷思

自以為的 和 實際拿到的 $c 結果相異:

  1. 該不會是 $a 覆蓋 $b ?! 我知道 "覆蓋",通常發生在:
  • 這種後寫($foo)的變數值 覆蓋 前寫的變數值,顯然 + 的覆蓋方式並不是先後順序的
<?php
$foo = "hello";
$foo = "world!";
return $foo; // "world!"
  1. + operator 在陣列中,代表的是什麼意思,參考 What is the difference between array_merge and array + array in PHP?
  • 陣列使用 + 作為運算符號時,+ 視作 union operator ,意指,它(+) 一次合併兩個陣列。 union operator 將右側陣列附加到左側陣列的末尾
  • 兩個陣列中的 key 相同,則結果陣列中,採用與 key 相對應的左側陣列中的 value,例如 $a, $b 陣列視作:
    • $b 陣列的 value: 5, 6, 7 的 key 相同於 $a 的 key,因此,當 $a, $b 兩個陣列在 key 相同的情況下,PHP 採用的是左側陣列 ($a) 的 value,輸出 $c: [1, 2, 3] 為正解。
<?php
/* 依照 element index 順序,陣列 $a 排序:
 * Array $a = (
 *  [0] => 1,
 *  [1] => 2,
 *  [2] => 3
 * )
 */ 

/* 依照 element index 順序,陣列 $b 排序:
 * Array $b = (
 *  [0] => 5,
 *  [1] => 6,
 *  [2] => 7
 * )
 */ 

結語

使用 + 合併陣列,雖說 + 是 union operator,但是使用上,又和數學上的 union (聯集) 存在差異,例如,左側 array key 或 element index 相同於右側,則左側陣列 value 覆蓋 右側陣列 value (數學上的聯集應是一同輸出左側陣列 value 和右側陣列 value)。


參考文章

1 What is the difference between array_merge and array + array in PHP?
2 Array Operators

3 PHP Arrays
4 Merging two arrays with the "+" (array union operator) How does it work?
5 array_merge vs array_replace vs + (plus aka union) in PHP


下一篇
[Day02] 合併陣列 (+) 補充
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言