Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вывод категорий неограниченной вложенности
Форумы портала PHP.SU » » Вопросы новичков » Вывод категорий неограниченной вложенности

Страниц (1): [1]
 

1. Telnet - 31 Октября, 2011 - 00:14:23 - перейти к сообщению
допустим есть такой вот массив
id parent_id title
1 0 дом
2 1 дверь
3 2 ручка
4 0 офис
5 4 окно
6 5 рама

нужно вывести ее примерно вот так
дом->дверь->ручка
офис->окно ->рама

Помогите уже всю голову на прочь сломал неполучается.
Знаю что как то нужно через рекурсию.
2. DeepVarvar - 31 Октября, 2011 - 00:58:58 - перейти к сообщению
Telnet пишет:
как то

То кака...
PHP:
скопировать код в буфер обмена
  1. function viewThreds(&$arr,$parent = 0) {
  2.   foreach ($arr as $item) {
  3.     if ($parent != 0) echo '-&gt';
  4.     if ($item['parent_id'] == $parent) echo $item['title'];
  5.     viewThreads($arr,$item['id']);
  6.     }
  7.   }
  8.  
  9. $arr = array(/* массив описаный выше */);
  10. viewThreads($arr);

Не проверял..
3. zypikov - 31 Октября, 2011 - 01:36:43 - перейти к сообщению
Через рекурсию не знаю как)Может поможет через многомерный массив

PHP:
скопировать код в буфер обмена
  1.  
  2. #$arr[$id]['parent_id']
  3. #$arr[$id]['title']
  4.  
  5. $arr[1]['parent_id'] = "0";
  6. $arr[1]['title'] = "Дом";
  7. $arr[2]['parent_id'] = "1";
  8. $arr[2]['title'] = "Дверь";
  9. $arr[3]['parent_id'] = "2";
  10. $arr[3]['title'] = "Ручка";
  11.  
  12. for ($q=1; $q<=3; $q++) {
  13. //echo $arr[$q]['parent_id']." ";
  14. echo $arr[$q]['title']."<br>";
  15. }

(Добавление)
DeepVarvar пишет:
$arr = array(/* массив описаный выше */);


Массив так задается

$arr = array("id"=>"1", "parent_id"=>"0", "title"=>"Дом");

?
4. DeepVarvar - 31 Октября, 2011 - 02:29:58 - перейти к сообщению
zypikov пишет:
Массив так задается
Если фраза без вопроса, то: Спасибо КЭП.
Если с вопросом, то:
PHP:
скопировать код в буфер обмена
  1. $arr = array(
  2.   0 => array("id"=>"1", "parent_id"=>"0", "title"=>"вася"),
  3.   1 => array("id"=>"2", "parent_id"=>"1", "title"=>"петя"),
  4.   2 => array("id"=>"3", "parent_id"=>"2", "title"=>"маша"),
  5.   3 => array("id"=>"4", "parent_id"=>"0", "title"=>"дуня"),
  6.   4 => array("id"=>"5", "parent_id"=>"4", "title"=>"даздраперма"),
  7.   5 => array("id"=>"6", "parent_id"=>"5", "title"=>"фёкла")
  8.   );
5. psevdo - 31 Октября, 2011 - 07:22:44 - перейти к сообщению
Массив у вас какой то непонятный)) Больше на таблицу БД похоже. Я делаю это через рекурсию. Может поможет:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. tree(0, '');
  4.  
  5. function tree($pid, $prefix)
  6. {
  7.    // поиск по по БД.. значение присваивается переменной $res
  8.    // select * from table where parent_id=$res
  9.    echo $prefix.$res;
  10.    prefix='->';
  11.    tree($res, $prefix);
  12. }
  13.  
  14.  
6. DeepVarvar - 31 Октября, 2011 - 07:41:54 - перейти к сообщению
psevdo пишет:
Я делаю это через рекурсию
А через что я это делаю, через юисрукер ??? Не понял
7. psevdo - 31 Октября, 2011 - 07:43:58 - перейти к сообщению
DeepVarvar пишет:
psevdo пишет:
Я делаю это через рекурсию
А через что я это делаю, через юисрукер ??? Не понял


Ой земляк, што то я пропустил твой пост)
8. DeepVarvar - 31 Октября, 2011 - 07:46:34 - перейти к сообщению
Радость
9. Самогонщик - 31 Октября, 2011 - 07:56:13 - перейти к сообщению
Если исходить из того, что цепочки не ветвятся, то можно решить просто через 2 цикла, сложность О(н) - это к я решению с рекурсией и постоянному поиску нужного элемента.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $arr = array(
  4.   0 => array("id"=>"1", "parent_id"=>"0", "title"=>"вася"),
  5.   1 => array("id"=>"2", "parent_id"=>"1", "title"=>"петя"),
  6.   2 => array("id"=>"3", "parent_id"=>"2", "title"=>"маша"),
  7.   3 => array("id"=>"4", "parent_id"=>"0", "title"=>"дуня"),
  8.   4 => array("id"=>"5", "parent_id"=>"4", "title"=>"даздраперма"),
  9.   5 => array("id"=>"6", "parent_id"=>"5", "title"=>"фёкла")
  10.   );
  11.  
  12. $cache = array();
  13. $cache["0"] = array();
  14.  
  15. foreach($arr as $id => $item)
  16. {
  17.   if($item["parent_id"] === "0")
  18.     $cache["0"][] = $id;
  19.   else
  20.     $cache[$item["parent_id"]] = $item;
  21. }
  22.  
  23. print_r($cache);
  24.  
  25. foreach($cache["0"] as $id)
  26. {
  27.   echo $arr[$id]["title"];
  28.  
  29.   $id = $arr[$id]["id"];
  30.  
  31.   while($cache[$id])
  32.   {
  33.     echo "->";
  34.     echo $cache[$id]["title"];
  35.     $id = $cache[$id]["id"];
  36.   }
  37.   echo "\n";
  38. }
  39.  
  40. ?>


В первом цикле строим индекс по парент_ид и запоминаем за одно всех родителей. А потом просто выводим всех родителей, и для каждого из них легко находим потомка, а потом следующего и следующего.
10. Telnet - 31 Октября, 2011 - 13:52:12 - перейти к сообщению
спасибо всем за помощь да этот массив получаю из таблы БД
не написал что б, не тратить ваше время зря, из БД как получить массив я знаю и получаю.
Тема такая нужно из названия этих категорий создать папочки ту типа
localhost/home/site/www/upload/д ом/дверь/ручка
localhost/home/site/www/upload/офис/окно/рама
(Добавление)
Array
(
[0] => Array
(
[0] => 1
[id] => 1
[1] => 0
[parent_id] => 0
[2] => -1
[owner_id] => -1
[3] => Мебель
[title] => Мебель
[4] =>
[name] =>
[5] => mebel
[alias] => mebel
)

[1] => Array
(
[0] => 2
[id] => 2
[1] => 1
[parent_id] => 1
[2] => -1
[owner_id] => -1
[3] => Шкафы-купе «СТЕРХ»
[title] => Шкафы-купе «СТЕРХ»
[4] =>
[name] =>
[5] => shkafy-kupe-sterh
[alias] => shkafy-kupe-sterh
)

[2] => Array
(
[0] => 3
[id] => 3
[1] => 0
[parent_id] => 0
[2] => 0
[owner_id] => 0
[3] => Кухни
[title] => Кухни
[4] =>
[name] =>
[5] => kuhni
[alias] => kuhni
)

[3] => Array
(
[0] => 4
[id] => 4
[1] => 0
[parent_id] => 0
[2] => 0
[owner_id] => 0
[3] => Бытовая техника
[title] => Бытовая техника
[4] =>
[name] =>
[5] => tehnika
[alias] => tehnika
)

[4] => Array
(
[0] => 5
[id] => 5
[1] => 0
[parent_id] => 0
[2] => 0
[owner_id] => 0
[3] => Люстры и светильники
[title] => Люстры и светильники
[4] =>
[name] =>
[5] => lighters
[alias] => lighters
)

[5] => Array
(
[0] => 6
[id] => 6
[1] => 1
[parent_id] => 1
[2] => -1
[owner_id] => -1
[3] => Спальни, гостиные и гардеробные
[title] => Спальни, гостиные и гардеробные
[4] =>
[name] =>
[5] => spalni-gostinye
[alias] => spalni-gostinye
)

[6] => Array
(
[0] => 7
[id] => 7
[1] => 1
[parent_id] => 1
[2] => 0
[owner_id] => 0
[3] => Мягкая мебель
[title] => Мягкая мебель
[4] =>
[name] =>
[5] => myagkaya-mebel
[alias] => myagkaya-mebel
)

[7] => Array
(
[0] => 8
[id] => 8
[1] => 1
[parent_id] => 1
[2] => 0
[owner_id] => 0
[3] => Детские
[title] => Детские
[4] =>
[name] =>
[5] => detskie
[alias] => detskie
)

[8] => Array
(
[0] => 9
[id] => 9
[1] => 0
[parent_id] => 0
[2] => 0
[owner_id] => 0
[3] => Сантехника и мебель для ванных комнат
[title] => Сантехника и мебель для ванных комнат
[4] =>
[name] =>
[5] => santehnika
[alias] => santehnika
)

[9] => Array
(
[0] => 10
[id] => 10
[1] => 9
[parent_id] => 9
[2] => 0
[owner_id] => 0
[3] => Смесители и аксессуары
[title] => Смесители и аксессуары
[4] =>
[name] =>
[5] => smesiteli
[alias] => smesiteli
)

[10] => Array
(
[0] => 11
[id] => 11
[1] => 9
[parent_id] => 9
[2] => 0
[owner_id] => 0
[3] => Ванны и душевые кабины
[title] => Ванны и душевые кабины
[4] =>
[name] =>
[5] => bath_and_shower
[alias] => bath_and_shower
)
часть того массива который я получаю

 

Powered by ExBB FM 1.0 RC1