2015-12-19 12 views
5

Tôi đang cố gắng tìm ra sự khác biệt giữa array_replace()array_merge(). Câu hỏi thực sự xuất hiện trong tâm trí của tôi sau bài đăng này: PHP array_merge empty values always less prioritar, nơi mà vấn đề thực sự có thể được giải quyết bằng bất kỳ chức năng nào trong hai chức năng này. Vì vậy, tôi đã cố gắng tìm hiểu trong trường hợp nào chúng ta nên sử dụng array_replace thay vì array_merge và ngược lại.Sự khác nhau giữa array_replace và array_merge trong PHP

Sau khi đọc các tài liệu php cho cả hai chức năng, tôi thấy hai sự khác biệt này:

  1. Nếu các mảng chứa phím số, giá trị sau này sẽ không ghi đè giá trị ban đầu trong array_merge(), mà sẽ được thực hiện trong array_replace() .
  2. Trong array_merge(), giá trị trong mảng đầu vào bằng các phím số sẽ được đổi số với các phím gia tăng bắt đầu từ số không trong mảng kết quả, không nên xảy ra với rray_replace().

Kể từ sự khác biệt chỉ liên quan đến phím số, chúng ta có thể an toàn nói rằng, chức năng array_replace()array_merge() là chính xác tương đương khi chúng ta đang đối phó với mảng kết hợp? Hoặc là có bất kỳ sự khác biệt nào khác mà tôi đang thiếu?

+0

Bạn nên thử nó và xem những gì bạn nhận được :) – zpr

+0

@zpr Hãy thử những gì? Nếu bạn thấy câu hỏi và câu trả lời được đề cập, giải pháp sẽ hoạt động với cả hai chức năng. Nhưng tôi chỉ cố gắng để biết, cho dù có thể có trường hợp khác, khi hai chức năng này sẽ không cho kết quả tương tự cho mảng kết hợp. –

Trả lời

6

Đối với các mảng có khóa chuỗi, có các giá trị này tương đương, như bạn đã đề cập. Nếu bạn có các phím số, array_merge() sẽ thêm chúng theo yêu cầu và thậm chí sắp xếp lại chúng nếu cần, trong khi array_replace() sẽ ghi đè các giá trị ban đầu.

Ví dụ,

$a = array('a' => 'hello', 'b' => 'world'); 
$b = array('a' => 'person', 'b' => 'thing', 'c'=>'other', '15'=>'x'); 

print_r(array_merge($a, $b)); 
/*Array 
(
    [a] => person 
    [b] => thing 
    [c] => other 
    [0] => x 
)*/ 

print_r(array_replace($a, $b)); 
/*Array 
(
    [a] => person 
    [b] => thing 
    [c] => other 
    [15] => x 
)*/ 

Như bạn thấy, array_merge đã tái lập chỉ mục các phím số của mảng, và cả trong số họ chỉ cần cập nhật các phím chuỗi.

Tuy nhiên, khi bạn có các phím số, array_merge() chỉ đơn giản là không quan tâm đến khóa và thêm mọi thứ theo thứ tự, không xóa gì, trong khi array_replace() sẽ thay thế các phím có chỉ số tương tự (số):

<?php 
$a = array('0'=>'a', '1'=>'c'); 
$b = array('0'=>'b'); 

print_r(array_merge($a, $b)); 
/*Array 
(
    [0] => a 
    [1] => c 
    [2] => b 
)*/ 

print_r(array_replace($a, $b)); 
/*Array 
(
    [0] => b 
    [1] => c 
)*/ 
+0

Cần lưu ý rằng nếu các mảng chia sẻ một khóa số thì có sự khác biệt đáng kể. Hợp nhất sẽ bảo toàn nội dung gốc trong khi thay thế là phá hoại. – tbernard

+0

@tbernard Ý của bạn là gì? Làm thế nào nó tác động đến nội dung (không chỉ các khóa)? –

+1

@TareqMahmood Ý tôi là cái này. Cho $ a = {0 => 'hello'} và $ b = {0 => 'goodbye'} sau đó mảng_merge ($ a, $ b) = {0 => 'hello', 1 => 'tạm biệt'} trong khi array_replace ($ a, $ b) = {0 => 'tạm biệt'}. Khi các phím là số và không kết hợp thì thay thế theo nghĩa đen sẽ thay thế.Hai hàm ** chỉ ** hoạt động tương tự cho các khóa hoặc khóa liên kết không được tìm thấy trong cả hai mảng đầu vào. – tbernard

0

Jarek đã đưa ra một lời giải thích thoải mái trong bài viết của mình ở đây:

https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Ông cũng cho biết thêm trong việc sử dụng các nhà điều hành + với mảng để so sánh.

Graphic showing the difference

+0

Cố gắng không chỉ sử dụng các liên kết làm câu trả lời. Thực hành tốt là sao chép thông tin có giá trị từ các nguồn được liên kết để giữ chúng trong trường hợp liên kết ngừng hoạt động – zajonc

Các vấn đề liên quan