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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Полный путь категорий и подкатегорий из "дерева" или двумерного массива [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
isle
Отправлено: 15 Июня, 2010 - 03:29:54
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




JustUserR, спасибо, я идею уже понял как сделать можно... перепробовал все варианты: одномерные массивы, двумерные и многомерные вложенные, сортировал по разному и т.д. Попытался без дерева всё сделать, просто пробежав несколько раз по двумерному массиву и соответственно удалив пройденные ячейки и т.д. Но не хватает пока практики сразу сделать вывод, я уже замучался с этими массивами... эх... учиться мне еще и учиться деревья сажать Растерялся

В общем, вернулся опять к дереву, как вытащить пути - разобрался, но никак не получается без лишних массивов, опять их приходится разбивать, кклеить и т.д. Если кто свободен и лучше разбирается в "деревьях, гляньте, пожалуйста, где что изменить, а то уже мозг закипел... С меня пивко ;) (сайт по стихам никак не восстановлю, копеек особо нет, поэтому "спасибо" очень скромное Растерялся ).

PHP:
скопировать код в буфер обмена
  1.  
  2.         $href = $id = $p = $pp = '';
  3.         function PrintTree($data,$lvl=0) {
  4.           global $ism, $domain, $slash, $catslist, $pcat, $num;
  5.           $level = 0; if (!$num) $num = 0;
  6.           foreach($data as $value) {
  7.                 $begin = "\t\t  <li>"; $end = "</li>\n";
  8.                 $link = $value['link']; $sub = $value['subCat'];
  9.                 $id = $value['id']; $pid = $value['pid'];
  10.                 if ($pid==0) $level = 0; else $level++;
  11.                 $url = geturlcat($link);
  12.                 $href = $domain.$slash.$url.'/';
  13.                 $link = str_replace('="'.$url.'"','="'.$href.'"',$link);
  14.                 if ($sub) {$end = ''; if ($lvl==1 || strpos($link,'<li ')) $begin = '';}
  15.                 #if ($sub && $level!=0) $p .= $id.'/'; #else $p = $id.'/';
  16.                 $list .= $begin.$link.$end; $pp = $id.'/';
  17.                 if ($sub) {
  18.                   if ($pid==0) {unset($pcat[$num]); $num = 0; $pp_ = $id.'/';}
  19.                   $pcat[$num] = $id.'/'; $num++; $pp .= $id.'/';
  20.                   $list .= "\n\t\t  <ul>\n".printTree($sub,$lvl++);
  21.                 } else {
  22.                   $pcat[$num] = $id.'/'; $pp_ .= $id.'/';
  23.                 }
  24.                 if ($lvl==1) $list .= "\t\t  </ul>\n\t\t  </li>\n";
  25.                 $lvl = 0; $pp_ = $id.'/';
  26.                 if ($pid==0) {
  27.                   while(count($pcat)>1) array_pop($pcat);
  28.                   $num = 0; $pcat[$num] = $id.'/'; $pp = $id.'/';
  29.                 }
  30.                 #if ($pcat) echo '<pre>'; print_r($pcat); echo '</pre>';
  31.                 if ($pp!='') echo $pp.'<br />';
  32.           }
  33.           return $list;
  34.         }
  35.         $catsblock = PrintTree($tree);


Если вконце распечатать массив $pcat, то видно, что пути нормальные (сейчас просто иды вывел для наглядности), а вот с простой переменной $pp ну прям беда Огорчение

Вот массив (дерево) в php для инклюда, если требуется:

Спойлер (Отобразить)
 
 Top
JustUserR
Отправлено: 16 Июня, 2010 - 10:51:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




isle пишет:
JustUserR, спасибо, я идею уже понял как сделать можно... перепробовал все варианты: одномерные массивы, двумерные и многомерные вложенные, сортировал по разному и т.д. Попытался без дерева всё сделать, просто пробежав несколько раз по двумерному массиву и соответственно удалив пройденные ячейки и т.д. Но не хватает пока практики сразу сделать вывод, я уже замучался с этими массивами... эх... учиться мне еще и учиться деревья сажать
Пожалуйста! Использование деревьев хорошо тем что позволяет использовать многомерные связные структуры - которые можно использовать для вывода меню и поиска В приведенном вами примере дерева при его прямом обходе имеется некоторая избыточность - поскольку каждый элемент содержит ссылку на родительский и притом явно в нем находится - такая ссылка как правило нужна при создании дерева из одномерного массива
Далее насколько я понял вам нужно вывести список URL-ссылок для всех элементов этого массива с учетом вложенности - поскольку исходный массив уже представляет собой дерево и для обращение к некоторому элементну можно использовать индексы многомерного массива
Если ваши выводимые URL-пути и другая информация каждого из пукнтов целиком содержится в нем самом независимо от родилельских элементов - то можете использовать следующую функцию для которой достатоно только настроить относительной позиционирование в CSS-стилях UL-блоков относительно их вложенности и вы получить готовое меню
PHP:
скопировать код в буфер обмена
  1. function print_tree($tree,&$out_txt)
  2. {$out_txt.="<ul>";
  3. foreach($tree as $id=>$cv_info)
  4. {$url = geturlcat($cv_info['link']); $href = 'somepath'.$url.'/';
  5. $link = str_replace('="'.$url.'"','="'.$href.'"',$link);
  6. $out_txt.="<li><a href=\"$link\">".$cv_info['link']."</a></li>";
  7. if(count($cv_info['subCat'])==0) {}
  8. else {print_tree($cv_info['subCat']);}
  9. }
  10. $out_txt.="</ul>";
  11. }


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
isle
Отправлено: 16 Июня, 2010 - 21:56:52
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




JustUserR, спасибо за пример, но в этом виде у меня он не работает - скрипт вылетает с ошибкой. Ошибка во втором операнде функции, не стал уже напрягаться и разбираться с этим, другие вопросы навалились...

Цитата:
$out_txt.="<li><a href=\"$link\">".$cv_info['link']."</a></li>";


лишняя строчка, она уже содержится в переменной $link, в которой я вытаскиваю урл и заменяю другим. Подобые хитрые вещи, как

&$a = $b;
---
$a = array('a'=>'aa','b'=>'bb');
$b = &$a['b']; #echo $b;
$b = 'cc';
echo $a['b'];

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

$b = array(0=>0);
$a = $b;
print_r($a);

всё просто, понятно и прозрачно... У меня работает; так я всё сразу понимаю Улыбка Ну, хотя у всех свой подход.

Сию функцию 1 в 1 нашел на phpclub.ru/faq/Tree на днях, пробовал под себя сделать, но не вышло. Ладно, оставлю пока как есть до лучших времен, может, сам раскурю со временем. Всем большое спасибо за отклики.
 
 Top
JustUserR
Отправлено: 17 Июня, 2010 - 10:45:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




isle пишет:
JustUserR, спасибо за пример, но в этом виде у меня он не работает - скрипт вылетает с ошибкой. Ошибка во втором операнде функции, не стал уже напрягаться и разбираться с этим, другие вопросы навалились...
Пожалуйста! К сожаению в данном примире точку проверку синтаксиса я не делал - однако главной тут является идея которая позволяет обрабатывать дерево более быстро и на его основе формировать различные списки и меню
Что касается использоваения ссылок то даже если их использование неочевидно то они все-таки позволяют экономить память и работают быстрее - ведь при передаче без ссылки определенной переменной которая предназначена только для чтения в функцию она будет заново копироваться что занимает время и память - кроме того использование ссылок позволяет рекурсивно работать со сложными структурами данных не передавая дополнительных переменных типа уровней и индексов Также немаловажно для сохранения статических состояний можно обойтись без глобальных переменных - ведь они делают функцию привязанной к определенному фрагменту кода и значит менее универсальной
isle пишет:
Ладно, оставлю пока как есть до лучших времен
Если вас интересует именно вывод меню на основе дерева данных то вышеуказанная функция почти делает это - вам нужно только подправить саму часть которая занимается обработкой гиперссылок Если же ссылка на определенную категорию формируется через цепочку родительских категорий - то можно ввести еще один аргумент в функции который передает для данного уровня вывода накопленный путь и потом добавлят его к гиперссылке - также появляется возможность по определенному параметру строить различные виды ссылок


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB