собственный 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!
 

Screjet

Новичок
по моему есси исп. стратические переменные, то будет веселее
(по идее, отпадает операция копирования при вызове функции)
 

.des.

Поставил пиво кому надо ;-)
гы :D

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

$all=$a1+$a2;
 

pachanga

Новичок
Результаты тестирования объединения 2-х сложных ассоциативных массивов(100 раз):

array_merge_recursive2: 0.156928 с
+: 0.000810 с

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

...и сколько вот таких еще приколов в php?
 

.des.

Поставил пиво кому надо ;-)
pacha это не прикол :)
это надо в мануал чаще заглядывать :)
 

pachanga

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

P.S. в мане где именно?
 

pachanga

Новичок
Все в мане я это место нашел:

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 ....
 

pachanga

Новичок
Сравни результаты:

Код:
$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...
 

pachanga

Новичок
Вот если бы в мане было написано:

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

то все было просто супер...
 

pachanga

Новичок
Попробовал еще и такой вариант:

Код:
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 раз)
 

deek

Новичок
<?
...
is_array($v) && isset($n[$k]) && is_array($n[$k])
...
?>

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

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

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