使用公共数组值连接两个多维数组

时间:2012-08-31 17:20:16

标签: php arrays join

我有两个数组,我想加入其中一个。两个数组都有一个共同的key =>值,我想将一个数组的值插入另一个数组,以便创建一个数组。

阵列1

Array
(
    [0] => Array
        (
            [ID] => 123456
            [Key] => 1000
            [value] => 123.45
        )

    [1] => Array
        (
            [ID] => 789012
            [Key] => 1001
            [value] => 56748.17
        )

)

数组2

Array
(
    [0] => Array
        (
            [Key] => 1000
            [description] => desc1
        )

    [1] => Array
        (
            [Key] => 1001
            [description] => desc2
        )

我想将数组2与数组1连接起来,以便生成的数组如下:


Array
(
    [0] => Array
        (
            [ID] => 123456
            [Key] => 1000
            [value] => 123.45
            [description] => desc1
        )

    [1] => Array
        (
            [ID] => 789012
            [Key] => 1001
            [value] => 56748.17
            [description] => desc2
        )

)

因此,使用[Key]值作为井键连接数组。我查看了array_merge和其他函数,但我似乎无法让这两个数组正确“合并”。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:0)

您必须执行类似

的操作
$result = array();    

foreach ($a1 as $v1)
{
    foreach ($a2 as $k2 => $v2)
    {
        if ($v1['Key'] === $v2['Key'])
        {
            $result[] = array_merge($v1, $v2);
            unset($a2[$k2]);
            break;
        }
    }
}

带有for循环的版本

$result = array();

$c_a1 = count($a1);
$c_a2 = count($a2);

for ($i = 0; $i < $c_a1; $i++)
{
    for ($j = 0; $j < $c_a2; $j++)
    {
        if ($a1[$i]['Key'] === $a2[$j]['Key'])
        {
            $result[] = array_merge($a1[$i], $a2[$j]);
            unset($a2[$j]);
            $c_a2--;
            break;
        }
    }
}

答案 1 :(得分:0)

试试这个,它是线性的

$keyval = array();

foreach($array1 as $item)$keyval[$item['Key']] = $item['value'];
foreach($array2 as $key=>$item)$array2[$key]['description'] = isset($keyval[$item['Key']]) ? $keyval[$item['Key']] : '';

答案 2 :(得分:0)

如果您始终可以保证$array1[$i]$array2[$i]对应,则

@radashk的解决方案将有效。从我对这个问题的解读来看,这不是保证,而是你要确保$array1[$i]['Key'] == $array2[$j]['Key'],并将这些键匹配的元素组合起来。

可能有更优雅的解决方案,但我会这样做:

    // builds up new $tmpArray, using the Key as the index
$tmpArray = array();
foreach($array1 as $innerArray1){
            $tmpArray[$innerArray1['Key']] = $innerArray1;
}

    //Merges the values from $array2 into $tmpArray
foreach($array2 as $innerArray2) {
            if (isset($tmpArray[$innerArray2['Key']])) {
                $tmpArray[$innerArray2['Key']] = array_merge($tmpArray[$innerArray2['Key']], $innerArray2);
            }else{
                $tmpArray[$innerArray2['Key']] = $innerArray2;
            }

}

答案 3 :(得分:0)

这是我的方法:

$temp_ array = array_fill_keys (array_map(create_function('$a', 'return $a["Key"];'), $array_1) , $array_1);
$result = array();
foreach ($array_2 as $item) {
    if (isset($temp_array[$item['Key']])) {
        $result[] = array_merge($item, $temp_array[$item['Key']]);
    }
}

我在上面的代码中进行了详细阐述,并达到了这个改进的版本:

function array_merge_items_by_common_key_value($key, $array_1, $array_2)
{
    $result = array();
    $temp_ array = array_fill_keys(array_map(create_function('$a', 'return $a["' . $key . '"];'), $array_1) , $array_1);
    foreach ($array_2 as $item)
    {
        $result[$item[$key]] = isset($temp_array[$item[$key]]) ? array_merge($item, $temp_array[$item[$key]]) : $item;
    }
    return array_values(array_merge($result, array_diff_key($array_1, $result)));
}

$merged_arrays = array_merge_items_by_common_key_value('Key', $temp_array, $array_2);

首先,创建一个临时数组:它等于$ array_1,但它的键是要匹配的值。

然后,$ array_2循环播放。找到匹配项后,合并完成。如果没有匹配,则保持$ array_2值不受影响。

最后,$ array_1中那些未匹配的值也会附加到生成的数组中。

因此,$ array_1或$ array_2的任何项目都不会丢失,而匹配的项目会合并。