You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP合并同键不同值数组:保留相同值、合并差异值

合并PHP数组:仅将不同值转为数组,保留相同值原样

我懂你的痛点——array_merge_recursive虽然能递归合并数组,但它会把所有相同键的值都打包成数组,哪怕两个值完全一样,这就导致像nid和title这种重复的相同值也被转成了数组,不符合你的预期。

要实现“相同值保留原样,不同值合并为数组”的效果,我们可以自己写一个自定义合并函数,逻辑很简单:遍历数组的每个键,对比两个数组对应键的值,根据是否相等来决定是保留原值还是合并成数组。

自定义合并函数实现

function mergeArraysPreserveSameValues($arr1, $arr2) {
    $merged = [];

    // 先处理第一个数组的所有键值对
    foreach ($arr1 as $key => $value) {
        if (isset($arr2[$key])) {
            // 值相等时直接保留,不等则打包成数组
            $merged[$key] = ($value === $arr2[$key]) ? $value : [$value, $arr2[$key]];
        } else {
            // 只存在于第一个数组的键,直接加入结果
            $merged[$key] = $value;
        }
    }

    // 再处理第二个数组中第一个数组没有的键
    foreach ($arr2 as $key => $value) {
        if (!isset($merged[$key])) {
            $merged[$key] = $value;
        }
    }

    return $merged;
}

测试你的输入

用你的示例数组来测试这个函数:

$array1 = array('1933' => array( 
    'nid' => '492811', 
    'title' => 'NEW TITLE', 
    'field_link_single_url' => 'abc', 
    'field_link_single_title' => 'test' 
));
$array2 = array('1933' => array( 
    'nid' => '492811', 
    'title' => 'NEW TITLE', 
    'field_link_single_url' => 'xyz', 
    'field_link_single_title' => 'abcd' 
));

// 合并两个子数组
$result = mergeArraysPreserveSameValues($array1['1933'], $array2['1933']);

// 打印结果
print_r($result);

输出结果

这会得到你期望的格式:

Array
(
    [nid] => 492811
    [title] => NEW TITLE
    [field_link_single_url] => Array
        (
            [0] => abc
            [1] => xyz
        )

    [field_link_single_title] => Array
        (
            [0] => test
            [1] => abcd
        )

)

扩展说明

如果之后需要合并多个类似的数组,你可以修改函数来接受可变参数,比如用func_get_args()获取所有传入的数组,然后循环对比每个数组的键值对,逐步合并。不过针对你当前的场景,上面的函数已经完全够用了。

内容的提问来源于stack exchange,提问作者Jeevan Bhushetty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:37:50