2011-11-01 44 views
7

Tôi biết điều này khá dễ dàng được thực hiện với foreach, sau đó là while -> danh sách, thủ tục v.v. (Tôi đã hoàn thành), tuy nhiên tôi cảm thấy mã của tôi hơi bẩn và không 't trông giống như giải pháp tốt nhất ... tôi đang tìm để sử dụng chức năng mảng PHP mẹ đẻ phải làm như sau:Mảng kết hợp PHP theo giá trị

tôi có hai mảng mà trông như thế này:

 
[0] (Array)#2 
    [rank] "579" 
    [id] "1" 
[1] (Array)#4 
    [rank] "251" 
    [id] "2" 

[0] (Array)#2 
    [size] "S" 
    [status] "A" 
    [id] "1" 
[1] (Array)#15 
    [size] "L" 
    [status] "A" 
    [id] "2" 

Và tôi cần là một kết quả như sau:

 
[0] (Array)#2 
    [size] "S" 
    [status] "A" 
    [id] "1" 
    [rank] "579" 

[1] (Array)#2 
    [size] "L" 
    [status] "A" 
    [id] "2" 
    [rank] "251" 

Có cách nào để có thể hợp nhất hai mảng với giá trị id (hoặc ay khác) mà không đi vào bộ vô tận foreach s?

+0

Các phần tử có cùng id ở cùng một chỉ mục trong cả hai mảng không? Nói cách khác, nếu phần tử có id 5 ở chỉ số 3 trong mảng đầu tiên, thì nó cũng sẽ ở chỉ số 3 trong mảng thứ hai không? – deviousdodo

Trả lời

13

Sử dụng array_merge_recursive()

$array = array_merge_recursive($array1, $array2); 

hoặc thực hiện chức năng của mình (nó có thể nhanh hơn)

function my_array_merge(&$array1, &$array2) { 
    $result = Array(); 
    foreach($array1 as $key => &$value) { 
     $result[$key] = array_merge($value, $array2[$key]); 
    } 
    return $result; 
} 
$array = my_array_merge($array1, array2); 
print_r($array); 
+0

Tuyệt vời !, cảm ơn vì điều này, FYI: cách tiếp cận chức năng hoạt động tuyệt vời miễn là bạn cần loại bỏ các bản ghi không lặp lại trên cả hai mảng. –

+5

Điều này không trả lời một cách kỹ thuật câu hỏi. @OsvaldoM. muốn tham gia dựa trên giá trị của id, không phải bằng các khóa. – Ray

0

ok, chúng ta hãy suppost mảng của bạn được gọi là $ arr1 và $ arr2, bạn có thể làm điều này:

<?php 
$newarray = Array(); 
foreach ($arr1 as $element=>$value){ 
    $newarray = array_merge($arr1[$element],$arr2[$element]) 
} 
?> 
0

Khi Ray nhận thấy trong nhận xét, câu trả lời được chấp nhận không thực sự trả lời câu hỏi. Tôi đã không thể tìm thấy một câu trả lời, vì vậy tôi tạo ra các chức năng sau nhỏ tiện ích:

function array_merge_callback($array1, $array2, $predicate) { 
    $result = array(); 

    foreach ($array1 as $item1) { 
     foreach ($array2 as $item2) { 
      if ($predicate($item1, $item2)) { 
       $result[] = array_merge($item1, $item2); 
      } 
     } 
    } 

    return $result; 
} 

Sử dụng nó như sau:

array_merge_callback($array1, $array2, function ($item1, $item2) { 
    return $item1['id'] == $item2['id']; 
}); 
0

Có một tốt đẹp để sáp nhập mảng như ngôn ngữ khác. Đó là bởi vì php có tự động đánh số các phần tử mảng và việc hợp nhất sẽ thay đổi hoặc thay thế các phần tử khác nhau bằng các khóa.

Bây giờ, nó đã thay đổi.

// array_fork 
    public static function array_fork() { 
    $args = func_get_args(); 
    $result = array(); 
    foreach ($args as $arr) { 
     is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.'); 
     foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      // recursion 
      !isset($result[$key]) && $result[$key] = array(); 
      $result[$key] = self::array_fork($result[$key], $arr[$key]); 
      continue; 
     } 
     if (is_numeric($key)) { 
      if (!in_array($arr[$key], $result)) 
      $result[] = $arr[$key]; 
     } else 
      $result[$key] = $arr[$key]; 
     } 
    } 
    return $result; 
    } 
0
function custom_array_merge(&$array1, &$array2) { 
    $result = Array(); 
    foreach ($array1 as $key_1 => &$value_1) { 
     // if($value['name']) 
     foreach ($array2 as $key_1 => $value_2) { 
      if($value_1['name'] == $value_2['name']) { 
       $result[] = array_merge($value_1,$value_2); 
      } 
     } 

    } 
    return $result; 
} 

// đèo $ array1, array2 & $ và thay đổi $ value_2 [ 'name'] // tên trên cơ sở đó u muốn kết hợp.

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