我有类似的需求,因为我需要合并包含配置值的n维数组,所以我最终编写了一个函数,我将它扩展了一点以适用于n维数组。
/**
* Recursively merges $array2 to $array1 while keeping the $array2 values
* and keys unique.
*
* @param array $array1 - destination array
* @param array $array2 - array containing new values
* @return array
*/
public function arraysMergeUnique($array1, $array2)
{
foreach ($array2 as $k => $v)
{
if (is_array($array1))
{
// If the meaning the value is a string, and doesn't already exist, add it
if (is_string($v) && ! in_array($v, $array1))
{
$array1[] = $v;
}
// If the value's an array, make a recursive call with it
else if (is_array($v))
{
if (isset($array1[$k]))
{
$array1[$k] = $this->arraysMergeUnique($array1[$k], $v);
}
else
{
$array1[$k] = $v;
}
}
}
else
{
$array1 = array($v);
}
}
return $array1;
}
例如,如果您的列表甚至更深,如果 'school1' 包含 'class1的':
$list1 = array(
'school1' => array(
'string1',
'string2',
'class 1' => array(
'student 1',
)
)
);
$list2 = array(
'school1' => array(
'string1',
'string3',
'class 1' => array(
'student 1',
'student 2',
),
'class 2' => array(
'student 3',
),
),
'school2' => array(
'string1',
'string4',
'string5'
)
);
所产生的阵列将完全合并它:
$result = array(
'school1' => array(
'string1',
'string2',
'class 1' => array(
'student 1',
'student 2'
),
'string3',
'class 2' => array(
'student 3'
)
),
'school2' => array(
'string1',
'string4',
'string5'
)
);
功能应该写成可以与引用一起工作,而不是像这样的值,这会大大提高大数组的性能,但是对于较小的数组,这种方法可以很好地工作。
这并不保留'$ list2 ['school1']',只有'$ list1 ['school1']'。 – BoltClock 2011-05-11 23:58:38
好:-)我改变了话题,使其更清楚....在我的眼睛'学校1'=='学校1'这是在问题中详细解释。 – Radek 2011-05-12 00:01:43
为什么不在第二个数组中的'string3'?正如标准的'array_merge'函数可以做到这一点,而且没有什么特别的“多维合并”。 – deceze 2011-05-12 00:07:53