[78] => Array
(
[id] => 78
[name] => Каталог
[sub] => Array
(
[77] => Array
(
[id] => 77
[name] => Расходные материалы
[sub] =>
)
....
как прально с него слепить обычный массив?
[78] => Array
(
[id] => 78
[name] => Каталог
)
[77] => Array
(
[id] => 77
[name] => Расходные материалы
)
я воспользовался все той же рекурсией
function recurs_in_array($arr) {GLOBAL $array;
foreach($arr as $key => $item) {
$array[]=$item['name'];
if(!empty($item['sub'])){recurs_in_array($item['sub']);}
}
return $array;
}
я нашел ток один выход - сделать массив $array глобальным. Но прально ли это?
Спустя 4 часа, 34 минуты, 1 секунда (3.03.2010 - 02:24) qpayct написал(а):
Nested sets
Спустя 33 минуты, 59 секунд (3.03.2010 - 02:58) kirik написал(а):
Цитата (Shurick @ 2.03.2010 - 13:50) |
Но прально ли это? |
Можно по ссылке передать аргумент в функцию вместо использования глобальной переменной. Хотя и глобальная тоже не сильно "плохо"

Спустя 17 минут, 9 секунд (3.03.2010 - 03:15) jetistyum написал(а):
function recurs_in_array($arr) {
$array = array();
foreach($arr as $key => $item) {
$array[]=$item['name'];
if(!empty($item['sub'])){
$array = array_merge($array, recurs_in_array($item['sub']));
}
}
return $array;
}
вот так тоже должно вроде работать ..
ну и еще вариант...
function recurs_in_array($arr, $array = null) {
$array = $array?$array:array();
foreach($arr as $key => $item) {
$array[]=$item['name'];
if(!empty($item['sub'])){
$array = recurs_in_array($item['sub'], $array);
}
}
return $array;
}
ну и еще передача по ссылке, ну и твой вариант ..

два часа ночи, код не тестил, может ошибки где есть.
Спустя 7 часов, 18 минут, 27 секунд (3.03.2010 - 10:33) Shurick написал(а):
Цитата (jetistyum @ 3.03.2010 - 00:15) |
function recurs_in_array($arr) { |
Работает так как надо! Спасибо!
Вообще хочу использовать данную функцию для вывода строки навигации каталога с неограниченным уровнем вложенности.
function recursive_in_array_merge($parent) {GLOBAL $db,$prefix;
$array = array();
$result=$db->sql_query("select id,name,parent from ".$prefix."_groups where id='".(int)$parent."'");
while($row=$db->sql_fetchrow($result)) {
$array[] = array('id' => $row['id'],'name' => $row['name']);
if($row['parent']!==0)$array = array_merge($array, recursive_in_array_merge($row['parent']));
}
return $array;
}
Есть вопрос -
Дольше ли работает рекурсивная функция по сравнению если бы использовалась выборка категорий через один запрос к базе. Допустим в базе есть значение branch (1,2,3,4...) и level, где перечесленны все материнские каталоги
"select id,name,parent from ".$prefix."_groups where id in (".$branch.") order by level"
если данный запрос будет работать действительно быстрее то можно было бы при построении каталога пользоваться рекурсивной функцией для формирования значения branch а а вывод через обычный запрос.
Посоветуйте как лучше сделать?
_____________