2015-07-02 52 views
7

我试图将两个不同的数组合并到一个数组中。任何人都可以帮助我吗?PHP通过值为两个不同的数组值合并数组

我有这样

[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" 

我需要这样的

[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

期望的输出对我来说并没有多大意义。 – treegarden

+0

你有试过什么吗?你如何获得这些数组? –

回答

0

虽然我不明白你为什么要这样合并阵列阵列,这是一个被合并的数组的方式他们的序列。所以阵列1的第一个孩子将与数组2等

<?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

如果序列不一样会怎么样? –

+0

如果大多数假设的答案是这种情况,并且@ user3686600想使用排名作为加入点,则此解决方案将不正确 – Ali

4

未测试的第一个孩子被合并,但这应该工作,或至少让你接近。

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

这将更改其中一个数组($ array1)。你必须根据你的标准确定接受。通常一个合并过程应该保持原来的根完好无损,并创建一个新的_(第三)_实体作为结果 – Ali

+1

修复,我们可以弄清楚它需要复制的密钥。没有看到任何理由补充,迄今为止。 – 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

一个适当的合并解决方案,但你假设**排名**键总是存在和唯一的两个阵列(这是很好,尽可能多的情况下:)) – Ali

+1

如果你有任何独特的关键男装,否则你使用一个否则你不需要检查condion和seconf for循环。 :) –

+0

同意,至今我们对**排名**的假设是有效的;) – 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

看你提供的阵列中,我假设你要使用的关键排名作为连接点(这似乎并不这样一个好主意,问题将是如果他们的唯一与否)如果它们是唯一的,然后一个小方法可以帮助基于他们的排名来获取元素,剩下的只是组装结果:

<?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); 

输出:

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

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

)