собственный array_merge_recursive

pachanga

Новичок
собственный array_merge_recursive

Мы используем описание структур данных с помощью ассоциативных массивов, которые, в принципе, могут быть любой вложенности, и очень часто возникает задача объединять массивы рекурсивно.

Стандартная функция array_merge_recursive не подходит, работает не так как надо бы...поэтому была написана своя функция(вообще-то был написан целый класс для работы с ассоциативным массивом):

Код:
function array_merge_recursive2($a1,$a2){
$n = $a1;

foreach($a2 as $k => $v)
if(is_array($v) && isset($n[$k]) && is_array($n[$k]))
$n[$k] = array_merge_recursive2($n[$k], $v);
else
$n[$k] = $v;

return $n;
}

Как думаете, что-то еще можно выжать из нее, заставив работать быстрее? Кстати, конструкция while(list()=each), работает процентов на 30 медленнее, чем foreach!
 
по моему есси исп. стратические переменные, то будет веселее
(по идее, отпадает операция копирования при вызове функции)
 
гы :D

сравни :)
$all=array_merge_recursive2($a1,$a2);
и

$all=$a1+$a2;
 
Результаты тестирования объединения 2-х сложных ассоциативных массивов(100 раз):

array_merge_recursive2: 0.156928 с
+: 0.000810 с

результирующий массив для + получается идентичным, что и для array_merge_recursive2

...и сколько вот таких еще приколов в php?
 
pacha это не прикол :)
это надо в мануал чаще заглядывать :)
 
стоп!
рано радоваться - у меня в тесте были массивы очень похожими, на самом деле объединения не происходит :(
происходит лишь копирование первого аргумента, т.е.
a = a1 + a2 одно и то же, что и a = a1 :(
...или у тебя иначе???

P.S. в мане где именно?
 
Все в мане я это место нашел:

The only array operator in PHP is the + operator. It appends the right handed array to the left handed, whereas duplicated keys are NOT overwritten.

Так вот это не совсем то. array_merge_recursive2 работает иначе. Ой, запутал ты меня .des ....
 
Сравни результаты:

Код:
$a = 
array("a" => "apple", "b" => "banana", "c" => 
array("f" => 'wow'));

$b = 
array("a" =>"pear", "b" => "strawberry", "c" => a
rray("b" => 'wow'));

$c = $b + $a;

print_r($c);

$c = array_merge_recursive2($b, $a);

print_r($c);

Array ( [a] => pear => strawberry [c] => Array ( => wow ) )

Array ( [a] => apple => banana [c] => Array ( => wow [f] => wow ) )

Вот меня как раз устраивает результат от array_merge_recursive2...
 
Вот если бы в мане было написано:

The only array operator in PHP is the + operator. It appends the right handed array to the left handed, whereas duplicated keys ARE overwritten.

то все было просто супер...
 
Попробовал еще и такой вариант:

Код:
function array_merge_recursive3($a1,$a2, &$n)
{
 $n = $a1;

 foreach($a2 as $k => $v)
  if(is_array($v) && isset($n[$k]) && is_array($n[$k]))
   array_merge_recursive3($n[$k], $v, &$n[$k]);
 else
  $n[$k] = $v;
}

Однако он медленнее:
array_merge_recursive2 -- 0.156518 с
array_merge_recursive3 -- 0.162723 с
(гонял опять же по 100 раз)
 
<?
...
is_array($v) && isset($n[$k]) && is_array($n[$k])
...
?>

а зачем вторая проверка (isset)?
ведь если переменная является массивом, то она явно возвращает isset() == TRUE

<?
...
is_array($v) && is_array($n[$k])
...
?>

небольшой выигрыш в скорости получишь ...
 
Сверху