2015-07-02 20 views
7

Tôi đã cố gắng hợp nhất hai mảng khác nhau thành một mảng duy nhất. Có ai có thể giúp tôi không?Mảng kết hợp PHP theo giá trị cho 2 giá trị mảng khác nhau

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

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

[0] (Array)#2 
    [size] "S" 
    [rank] "251" 
[1] (Array)#15 
    [size] "L" 
    [rank] "579" 

tôi cần như thế này

[0] (Array)#2 
    [size] "S" 
    [rank] "251" 
    [id] "1" 
[1] (Array)#15 
    [size] "L" 
    [rank] "579" 
    [id] "1" 
+4

[array_merge] (http://php.net/manual/en/function.array-merge.php)? – Andrew

+0

đầu ra mong muốn không thực sự có ý nghĩa với tôi. – treegarden

+0

Bạn đã thử mọi thứ chưa? Làm thế nào bạn nhận được những mảng? –

Trả lời

0

Trong khi tôi không hiểu lý do tại sao bạn muốn kết hợp các mảng theo cách này, đây là một cách để kết hợp các mảng bởi trình tự của họ. vì vậy các con đầu lòng của array1 sẽ được sáp nhập với đứa con đầu lòng của array2, vv

<?php 

$array1 = [ 
    [ 
     'rank' => 579, 
     'id' => 1 
    ], 
    [ 
     'rank' => 251, 
     'id' => 2 
    ] 
]; 

$array2 = [ 
    [ 
     'size' => 'S', 
     'rank' => 251 
    ], 
    [ 
     'size' => 'L', 
     'rank' => 579 
    ] 
]; 


foreach ($array1 as $key => &$data) { 
    if (isset($array2[$key])) { 
     $data = array_merge($data, $array2[$key]);  
    } 
} 

var_dump($array1); 
+0

Nếu chuỗi không giống nhau thì sao? –

+0

nếu hầu hết các câu trả lời được giả định là trường hợp và @ user3686600 muốn sử dụng thứ hạng làm điểm tham gia, giải pháp này sẽ không chính xác – Ali

4

chưa được kiểm tra, nhưng điều này sẽ làm việc, hoặc ít nhất giúp bạn có được gần gũi.

for ($array1 as $key1 => $value1) { 
    for ($array2 as $key2 => $value2) { 
     if ($value1['rank'] == $value2['rank']) { 
      $result[$key1] = [$value2['size'], $value1['rank'], $value1['id']]; 
     }; 
    }; 
}; 
+0

Điều này sẽ thay đổi một trong các mảng ($ array1). bạn phải đảm bảo rằng điều đó được chấp nhận dựa trên tiêu chí của bạn. thường là một quá trình hợp nhất nên để lại cả hai gốc nguyên vẹn và tạo ra một _ (thứ ba) thực thể mới là kết quả – Ali

+1

Cố định, chúng tôi/tôi có thể làm cho nó tìm ra các phím cần sao chép. Không thấy bất kỳ lý do gì để thêm vào đó. – psycotik

1
foreach($arr1 as $key1 => $data1){ 
    foreach($arr2 as $key2 => $data2){ 
     if($data1['rank']==$data2['rank']){ 
      $result[] = array_merge($data1, $data2); 
     } 
    } 
} 
print_r($result); 
+0

một giải pháp hợp nhất hợp lệ nhưng bạn giả định rằng khóa ** rank ** luôn luôn hiện diện và duy nhất trong cả hai mảng (điều này cũng tốt như trường hợp :)) – Ali

+1

nếu bạn có bất kỳ khóa chính nào mà bạn đã sử dụng bạn không cần phải kiểm tra nếu condion và seconf cho vòng lặp. :) –

+0

Đồng ý, theo giả định của chúng tôi xung quanh ** xếp hạng ** là hợp lệ;) – Ali

0
//save keys of ranks in the 1st array 
$keys = array(); 
foreach($arr1 as $k => $v) 
    $keys[$v['rank']] = $k; 

$res = array(); 
// Walk through the 2nd array and make result 
foreach($arr2 as $k => $v) 
if (isset($keys[$v['rank']])) 
    $res[] = array_merge($arr1[$keys[$v['rank']]], $v); 

print_r($res); 
0

Nhìn vào mảng cung cấp của bạn, tôi giả sử bạn muốn sử dụng phím rank như là điểm tham gia (mà không có vẻ là một ý tưởng tốt như vậy, và câu hỏi sẽ là nếu chúng độc đáo hay không) nếu chúng là duy nhất thì một phương pháp nhỏ có thể giúp tìm nạp phần tử dựa trên xếp hạng của chúng và phần còn lại chỉ lắp ráp kết quả:

<?php 

$arr1 = [ 
    [ 
     'rank' => 579, 
     'id' => 1 
    ], 
    [ 
     'rank' => 251, 
     'id' => 2 
    ], 
]; 

$arr2 = [ 
    [ 
     'size' => 'S', 
     'rank' => 251 
    ], 
    [ 
     'size' => 'L', 
     'rank' => 579 
    ], 
]; 

function getItemByRank($array, $rank) 
{ 
    foreach ($array as $item){ 
     if ($item['rank'] === $rank) { 
      return $item; 
     } 
    } 
} 


$result = []; 
foreach ($arr1 as $k => $item) { 

    $match = getItemByRank($arr2, $item['rank']); 

    if (isset($match)) { 
     $result[$k] = $item; 
     $result[$k]['size'] = $match['size']; 
    } 
} 

print_r($result); 

output:

Array 
(
    [0] => Array 
     (
      [rank] => 579 
      [id] => 1 
      [size] => L 
     ) 

    [1] => Array 
     (
      [rank] => 251 
      [id] => 2 
      [size] => S 
     ) 

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