2

我有两个要合并为一个的数组。两个数组都有一个共同的 key=>value,我想将一个数组的值插入另一个数组,以便创建一个数组。

阵列 1

大批
(
    [0] => 数组
        (
            [ID] => 123456
            [键] => 1000
            [价值] => 123.45
        )

    [1] => 数组
        (
            [ID] => 789012
            [键] => 1001
            [价值] => 56748.17
        )

)

阵列 2

大批
(
    [0] => 数组
        (
            [键] => 1000
            [描述] => desc1
        )

    [1] => 数组
        (
            [键] => 1001
            [描述] => desc2
        )

我想将 Array 2 与 Array 1 连接起来,以便生成的 Array 如下所示:

大批
(
    [0] => 数组
        (
            [ID] => 123456
            [键] => 1000
            [价值] => 123.45
            [描述] => desc1
        )

    [1] => 数组
        (
            [ID] => 789012
            [键] => 1001
            [价值] => 56748.17
            [描述] => desc2
        )

)

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

任何帮助,将不胜感激。

4

4 回答 4

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;
        }
    }
}
于 2012-08-31T17:46:20.740 回答
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 中的任何项目都不会丢失,而匹配的项目会被合并。

于 2012-08-31T17:59:02.510 回答
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']] : '';
于 2012-08-31T17:47:30.133 回答
0

如果您始终可以保证$array1[$i]对应于.@radashk 的解决方案将起作用$array2[$i]。从我对问题的阅读来看,这并不能保证,但是您想确保$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;
            }

}
于 2012-08-31T17:51:46.467 回答