PHP合并两个数组:保留原数组名为子键的实现问题
How to Merge Arrays by Keys with Preserving Original Array Names as Subkeys in PHP
我明白你的需求了——你希望把两个数组按照它们的顶级键(比如mobile、tv)合并,并且每个顶级键下面要保留原数组的名字(array1和array2)作为子键,分别存放对应原数组里的内容。但array_merge_recursive()确实做不到这一点,它只会把同键的数组合并成一个扁平的列表,这和你的预期不符。
原数组示例
$array1 = array( 'mobile' => array( array('item' => 'apple','price' => 4), array('item' => 'nokia','price' => 39), array('item' => 'samsung','price' => 8) ), 'tv' => array( array('item' => 'LG','price' => 39), array('item' => 'max', 'price' => 8 ), array('item' => 'diaken','price' => 3 ) ) ); $array2 = array( 'mobile' => array( array('item' => 'HTC','price' => 4 ), array('item' => 'OnePlus' ,'price' => 39), array('item' => 'Nexus','price' => 8 ) ), 'tv' => array( array('item' => 'LG','price' => 39), array('item' => 'Panasonic','price' => 8 ), array('item' => 'Toshiba' ,'price' => 3 ) ) );
你的预期输出
array( 'mobile' => array( 'array1' => array( '0' => array('item' => 'apple','price' => 4), '1' => array('item' => 'nokia','price' => 39), '2' => array('item' => 'samsung','price' => 8), ), 'array2' => array( '0' => array('item' => 'HTC','price' => 4), '1' => array('item' => 'OnePlus','price' => 39), '2' => array('item' => 'Nexus','price' => 8) ) ), 'tv' => array( 'array1' => array( '0' => array('item' => 'LG','price' => 39), '1' => array('item' => 'max','price' => 8), '2' => array('item' => 'diaken','price' => 3) ), 'array2' => array( '0' => array('item' => 'LG','price' => 39), '1' => array('item' => 'Panasonic','price' => 8), '2' => array('item' => 'Toshiba','price' => 3) ) ) )
array_merge_recursive()的问题
这个函数会把同键的数组元素直接合并到一个数组中,结果是扁平的,没有保留原数组的标识:
Array ( 'mobile' => Array ( Array('item' => 'apple','price' => 4), Array('item' => 'nokia','price' => 39), Array('item' => 'samsung','price' => 8), Array('item' => 'HTC','price' => 4 ), Array('item' => 'OnePlus' ,'price' => 39), Array('item' => 'Nexus','price' => 8 ), ), 'tv' => Array ( Array('item' => 'LG','price' => 39), Array('item' => 'max', 'price' => 8 ), Array('item' => 'diaken','price' => 3 ), Array('item' => 'LG','price' => 39), Array('item' => 'Panasonic','price' => 8 ), Array('item' => 'Toshiba' ,'price' => 3 ) ) )
解决方案:自定义合并函数
我们可以写一个简单的函数来实现你的需求,逻辑是遍历两个数组的所有顶级键,为每个键创建包含array1和array2子键的结构:
function mergeWithOriginalKeys($array1, $array2) { // 获取两个数组的所有顶级键的并集 $allKeys = array_unique(array_merge(array_keys($array1), array_keys($array2))); $result = []; foreach ($allKeys as $key) { // 从array1中获取对应值,不存在则设为空数组 $val1 = isset($array1[$key]) ? $array1[$key] : []; // 从array2中获取对应值,不存在则设为空数组 $val2 = isset($array2[$key]) ? $array2[$key] : []; $result[$key] = [ 'array1' => $val1, 'array2' => $val2 ]; } return $result; }
测试函数
调用这个函数并打印结果:
$mergedArray = mergeWithOriginalKeys($array1, $array2); print_r($mergedArray);
执行后,输出的结果就会和你预期的完全一致,每个顶级键下都保留了array1和array2作为子键,分别存放原数组的对应内容。
内容的提问来源于stack exchange,提问作者webpic
相关产品推荐
相关产品推荐

