Оптимизация рекурсивной функции на php

12
_
На сайте с 09.06.2008
Offline
158
1376

Господа, имеем такую функцию

function getAllCategories($id,&$data,&$arr1,&$arr2)

{
unset ($children);
$j=count($arr2);
for ($i=0;$i<$j;$i++) { if ($arr2[$i]==$id) $children[]=$arr1[$i]; }

if (!empty($children)) { foreach ($children as $child) { $data[]=$child; getAllCategories($child,$data,$arr1,$arr2); }}
}

Здесь массивы $arr1 и $arr2 из 1400 записей содержат id категории и соответсвенно id родителя.

Задача найти всех детей категорий, то есть без рекурсии тут никак (от 2 до 7 уровней).

Скрипт выполняется для текущих параметров порядка 10 секунд, что очень много.

Как можно ускорить данный участок кода?

Настраиваю напильником Joomla 1.5 (http://joomla15.ru) Если постоянно взламывают движок, достаточно сменить хостинг (http://2s4.ru/ytx) всем СРОЧНО (14 дек) обновлять или патчить joomla-сайты (/ru/forum/919351)
R
На сайте с 23.10.2007
Offline
21
#1

кэшируйте вывод и обновляйте кэш при изменении категорий

_
На сайте с 09.06.2008
Offline
158
#2

Кэш само-собой будет подключен на продакшн, интересует именно оптимизация данного участка.

Может не передавать массивы?

dvaes
На сайте с 03.09.2007
Offline
65
#3

сначала привести хотя бы в удобочитаемый вид

функция вообще работает? говнокод какой-то...

_
На сайте с 09.06.2008
Offline
158
#4

Функция работает, что именно не нравится в оформлении? Названия переменных?

[umka]
На сайте с 25.05.2008
Offline
456
#5

Попробуйте массивы в функции обявить как global, и передавать только "текущую позицию".

Лог в помощь!
_
На сайте с 09.06.2008
Offline
158
#6
'[umka:
;7604760']Попробуйте массивы в функции обявить как global, и передавать только "текущую позицию".

Передаются указатели на массивы, так что есть ли смысл?

[umka]
На сайте с 25.05.2008
Offline
456
#7
_voland_:
Передаются указатели на массивы, так что есть ли смысл?

А фиг знает, как оно в PHP реализовано :)

Я бы попробовал.

А сколько всего раз вызывается функция за один проход?

A
На сайте с 13.09.2010
Offline
1
#8

страх

10 секунд

у меня больше 1000 записей меньше 0,5 секунды (может хостер мощный ?)

причем, там такие навороты.

От простого к сложному
Robin_Bad
На сайте с 24.12.2007
Offline
85
#9

avtorkoda, всё зависит от данных, лежащих в массиве. Одно дело одномерный массив чисел от 1 до 9, и совсем другое - массив полей данных о пользователе, включая рост, вес и возраст и т.п.

Я бы предложил ТС любым способом уходить от такого способа обработки данных. Рискну предположить, что это вы строите дерево категорий, выдернутое из базы, где оно хранится в виде Adjacency list? Есть ведь и другие способы хранения деревьев.

_
На сайте с 09.06.2008
Offline
158
#10

В один проход вызывается от 2 до 10 функций рекурсивно.. глубино рекурсии до 7.

Верно, это дерево каталогов, данные хранятся в виде строк id, parent в каждой.

Пишу не с нуля, так что преобразовывать структуру - никак.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий