PHP kết hợp hai mảng liên kết thành một mảng


85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

Tôi cần một mảng mới kết hợp tất cả lại với nhau, tức là nó sẽ là

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

Cách tốt nhất để làm việc này là gì?

Xin lỗi, tôi đã quên, các id sẽ không bao giờ khớp với nhau, nhưng về mặt kỹ thuật, các tên có thể, nhưng sẽ không có khả năng xảy ra và tất cả chúng cần được liệt kê trong một mảng. Tôi đã xem xét array_merge nhưng không chắc đó có phải là cách tốt nhất để làm điều này hay không. Ngoài ra, bạn sẽ kiểm tra đơn vị này như thế nào?


5
Có vẻ như bạn chỉ đang tìm kiếm array_merge.
Corbin

Tôi nghĩ cách tốt nhất, nếu bạn biết các khóa đều khác nhau, là sử dụng toán tử + =: $ array1 + = $ array2; Điều này nối tất cả các phần tử của $ array2 vào cuối $ array1.
David Spector

Câu trả lời:


127

array_merge() hiệu quả hơn nhưng có một số lựa chọn:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
Lợi ích của array_merge so với việc sử dụng toán tử là gì?
jsteinmann

37
Array Union (+): Toán tử + nối các phần tử của các khóa còn lại từ mảng bên phải sang bên trái, trong khi các khóa trùng lặp KHÔNG bị ghi đè. array_merge (): Nếu các mảng đầu vào có các khóa chuỗi giống nhau, thì giá trị sau của khóa đó sẽ ghi đè lên giá trị trước đó. Tuy nhiên, nếu các mảng chứa các khóa số, giá trị sau này sẽ không ghi đè giá trị ban đầu mà sẽ được nối thêm. Nếu tất cả các mảng chỉ chứa các khóa số, mảng kết quả sẽ được cung cấp các khóa tăng dần bắt đầu từ số không.
Samuel Cook

12
Cũng cần lưu ý rằng array_mergesẽ trả về NULL nếu bất kỳ đối số nào là NULL.
SeanWM

4
Nếu có các khóa số nguyên, thì chúng sẽ được đổi thành khóa số nguyên BẮT ĐẦU từ 0. Hãy hết sức cẩn thận với array_merge. Tốt hơn hãy sử dụng vòng lặp foreach để thực hiện những gì bạn đang cố gắng làm.
user2850305

24

Kiểm tra array_merge().

$array3 = array_merge($array1, $array2);

22
@SudhanshuSaxena Xem xét tôi là người đầu tiên đăng nó, tôi không thấy nó có thể là một câu trả lời lặp lại như thế nào.
Brad

10

Cũng có array_replace, nơi một mảng ban đầu được sửa đổi bởi các mảng khác bảo toàn liên kết khóa => giá trị mà không tạo ra các khóa trùng lặp.

  • Các khóa tương tự trên các mảng khác sẽ khiến các giá trị ghi đè lên mảng ban đầu
  • Các khóa mới trên các mảng khác sẽ được tạo trên mảng ban đầu

1
Đây là câu trả lời chính xác. array_merge sẽ không hoạt động nếu bạn có các khóa số (tất cả các khóa sẽ được chuyển đổi thành các chỉ mục nhất quán).
Dmitry

3

Tôi sử dụng một trình bao bọc xung quanh array_merge để đối phó với nhận xét của SeanWM về mảng null; Đôi khi tôi cũng muốn loại bỏ các bản sao. Nói chung tôi cũng muốn hợp nhất một mảng này vào một mảng khác, thay vì tạo một mảng mới. Điều này kết thúc là:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

Nếu nó là số nhưng không phải là mảng liên kết tuần tự, bạn cần sử dụng array_replace


0

Tôi tình cờ gặp câu hỏi này khi cố gắng xác định một cách hợp lý để nối hai mảng assoc.

Tôi đang cố gắng tham gia hai bảng khác nhau không có mối quan hệ với nhau.

Đây là những gì tôi nghĩ ra cho Truy vấn PDO kết hợp hai Bảng. Samuel Cook là người đã xác định giải pháp cho tôi với array_merge()+1 cho anh ấy.

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

Có thể điều này sẽ giúp đỡ người khác.


0

CẬP NHẬT Chỉ cần lưu ý nhanh, như tôi có thể thấy điều này trông thực sự ngu ngốc, và nó không có tác dụng tốt với PHP thuần túy vì array_mergechỉ hoạt động ở đó. NHƯNG hãy thử nó với trình điều khiển PHP MongoDB trước khi bạn vội vàng phản đối. Anh chàng đó SẼ thêm các chỉ mục vì bất kỳ lý do gì, và SẼ làm hỏng đối tượng đã hợp nhất. Với chức năng nhỏ bé ngây thơ của tôi, sự hợp nhất xuất hiện chính xác theo cách mà nó được cho là với truyền thống array_merge.


Tôi biết đó là một câu hỏi cũ nhưng tôi muốn thêm một trường hợp nữa tôi đã có thời gian gần đây với các truy vấn tài xế MongoDB và không ai trong số array_merge, array_replacecũng không array_pushlàm việc. Tôi có một cấu trúc phức tạp của các đối tượng được bao bọc dưới dạng mảng trong mảng:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Và tôi cần hợp nhất chúng để giữ nguyên cấu trúc như sau:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Giải pháp tốt nhất mà tôi nghĩ ra là:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.