У меня была похожая потребность, потому что мне нужно было объединить 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'
)
);
Функция должнавероятно, написано так, чтобы оно работало со ссылками, а не со значениями, подобными этому, что значительно улучшило бы производительность с большими массивами, но это прекрасно работает с меньшими.