Так ты хотите merge массивы рекурсивно ... если существует только such an array_merge_recursive
функция ... Почему бы вам не попробовать это:
$a = array(
array('colour' => 'green'),
array('colour' => 'blue'),
array('width' => 123)
);
$result = array();
foreach($a as $arr)
{
$result = array_merge_recursive($result, $arr);
}
var_dump($result);
Это работало довольно чертовски хорошо для меня, as you can see for yourself here, too
Правда, в данном примере width
воны «т быть массивом, так что вы получите:
array('colour' => array('green','blue'),'width' => 123);
Если вы нужду все, чтобы быть массив, то грязный исправить было бы использовать бросок:
foreach($result as $k => $v) $result[$k] = (array) $v;
переназначение $result
дорожит второй раз, только литье их как массив гарантирует, что все значения будут, по-видимому, быть массивами. Массив, который преобразуется в массив, останется неизменным, так же как (int) 1
по-прежнему оценивает значение 1. Первоначальное значение (строки, целые числа, удваивает, ...) будет завернуто int массив, но объект будет преобразован в массив, поэтому будьте осторожны. Если объекты могут иметь место в этом массиве:
foreach($result as $k => $v) $result[$k] = is_array($v) ? $v : array($v);
, вероятно, более безопасная ставка. Тем не менее, я выбрал не, чтобы пойти на этот подход, поскольку я все еще нахожу его довольно утомительным и глупым, чтобы обернуть все в массив, содержащий только одно значение ...
Для тех из вас, со странным предпочтением неосновательного кода, следующие один-лайнер конденсированный, но обратите внимание, свободный & рабочего примера ту же коду:
foreach($a as $arr) $result = array_merge_recursive(isset($result) ? $result : array(), $arr);
Это как ответ на Стюарт Уэйкфилд, который предложил один лайнер, используя call_user_func_array
, что я всегда буду противостоять, пока я живу и дышу, BTW ...
На основании каких условий? –