[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: массив с иерархической вложенностью => массив
Shurick
есть массив полученный через рекурсию:


[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)
Но прально ли это?

Можно по ссылке передать аргумент в функцию вместо использования глобальной переменной. Хотя и глобальная тоже не сильно "плохо" smile.gif

Спустя 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;
}

ну и еще передача по ссылке, ну и твой вариант .. smile.gif
два часа ночи, код не тестил, может ошибки где есть.

Спустя 7 часов, 18 минут, 27 секунд (3.03.2010 - 10:33) Shurick написал(а):
Цитата (jetistyum @ 3.03.2010 - 00:15)
  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 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 а а вывод через обычный запрос.

Посоветуйте как лучше сделать?


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.