algolia search

Tìm thấy x bài viết trong xms.

PHP có nhiều cách kết hợp hai mảng thành một. Có một sự khác biệt tinh tế giữa hai phương pháp, một sự khác biệt đáng biết.

Chúng ta hãy xem xét so sánh hai phương thức này:

array_merge($first, $second);

// vs.

$first + $second;

Giả sử đây là hai mảng mà chúng ta đang làm việc:

$first = [
    'a',
    'b',
];

$second = [
    'c',
];

Đây sẽ là kết quả của array_merge:

array_merge($first, $second);

[
    'a',
    'b',
    'c',
]

Trong khi toán tử + cho chúng ta kết quả này:

$first + $second;

[
    'a',
    'b',
]

Chuyển đổi vị trí của first và second lại cho ra 1 kết quả khác:

$second + $first;

[
    'c',
    'b',
]

Có lẽ bạn đang bối rối? Tôi cũng vậy 😅😅

Bây giờ, ta viết lại mảng $first và $second đầy đủ các chỉ mục của chúng. Điều này sẽ làm cho mọi thứ rõ ràng hơn:

$first = [
    0 => 'a',
    1 => 'b',
];

$second = [
    0 => 'c',
];

Bây giờ bạn có thể đoán được điều gì đang diễn ra:

  • với toán tử + nếu khóa tồn tại ở 2 mảng nó sẽ giữ lại giá trị của mảng đầu tiên và chỉ thêm các phần tử ở bên phải ($second) vào bên trái ($first) nếu bên trái không tồn tại KHÓA đó
  • trong khi đó array_merge với key dạng số nó sẽ đánh lại số đó nhé!!! nếu khóa dạng string thì nó sẽ ghi đè lên nếu KHÓA đó đã tồn tại.

Theo định nghĩa đó, chúng ta cũng có thể xác định rằng + không bao giờ có thể được sử dụng để nối các mảng đa chiều, vì nó sẽ không đụng đến các phần tử chịu ảnh hưởng:

$first = [
    'A' => [
        'B' => true,
        'C' => true,
    ],
];

$second = [
    'A' => [
        'B' => false,
        'C' => false,
    ],
];

$first + $second;

// kết quả là
[
    'A' => [
        'B' => true,
        'C' => true,
    ],
]

// trong khi dùng array_merge($first, $second); chúng ta sẽ có kết quả khác
[
    'A' => [
        'B' => false,
        'C' => false,
    ],
]

"À mà khoan, có gì đó sai sai", hình như tôi đang nghe bạn lẩm bẩm gì đó: "chẳng phải array_merge_recursive đã hỗ trợ rồi sao"

Ở đây chúng tôi có một trường hợp đặt tên rất đáng tiếc 😅😅. Xin đừng ngạc nhiên 😂😂 — PHP said 🤣🤣.

Hãy xem, array_merge sẽ hợp nhất các phần tử phù hợp bằng cách ghi đè chúng. Dùng array_merge_recursive sẽ khác, nó sẽ giữ cả hai phần tử và hợp nhất chúng trong một mảng mới, giữ cả hai giá trị.

Đây là ví dụ trước của chúng ta, và kết quả bằng array_merge_recursive:

[
    'A' => [
        'B' => [
            true,
            false,
        ],
        'C' => [
            true,
            false,
        ],
    ],
]

Điều gì về việc sáp nhập nhiều mảng? Bạn có thể đoán kết quả ngay bây giờ:

$first = ['a'];
$second = ['b'];
$third = ['c'];

// gộp
array_merge($first, $second, $third);

// kết quả
[
    'a',
    'b',
    'c',
]

// gộp bằng +
$first + $second + $third

// kết quả rất là ngáo đá =))
[
    'a',
]

Với bài viết nho nhỏ này, tôi hy vọng rằng bạn sẽ không thấy mình bối rối nữa khi bạn đi vào code PHP và cần gộp mảng.

Nguồn: https://stitcher.io/blog/array-merge-vs+ và tất nhiên được dịch bởi chàng trai thanh lịch vô địch khắp vũ trụ Chung Nguyễn 😆😆

Đánh giá bài viết

Thích thì like
PHP: khác nhau trong kết hợp mảng bằng array merge và +
4.5/5 2 votes

Bình luận

Vượng Nguyễn avatar
Vượng Nguyễn

Hai em này thì nhà em nhớ thế này:

1) + operator: gộp value trong B vào A theo key. Nếu B có key khác với key ở A thì nó mới gộp.


2) array_merge gộp value trong B vào A theo key. Nếu B có key là string giống ở A thì nó ghi đè từ value B vào value A. Nếu key là integer thì gộp hết bất kể giống nhau, và index là key integer mới sẽ được tạo.


3) thêm array_merge_recursive gộp value B vào A. Nếu B có key là string giống A thì thay vì ghi đè như array_merge() nó sẽ gộp 2 value cùng một key là string vào làm một array. Key index bắt đầu lại từ đầu, key string giữ nguyên.

Chung Nguyễn avatar
Chung Nguyễn

thanks bác nhiều nhé 😋

hominh hoang avatar
hominh hoang

a

Nguyễn Duy Nguyên avatar
Nguyễn Duy Nguyên

đọc xong cũng ngáo đá theo =)))


Chung Nguyễn avatar
Chung Nguyễn

kaka, cảm ơn bạn đã thừa nhận tài năng của mình :D

Hiển thị bình luận Facebook