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
相关产品推荐
相关产品推荐

