Построение дерева

Mecm

Новичок
Здравствуйте. Мы на сайте используем Smarty и Simpla. Необходимо построить дерево категорий. Вывожу массив таким образом.

API-шка:
PHP:
public function showTree(){
		$query = $this->db->placehold("SELECT id, parent_id, name, url FROM __categories");
		$this->db->query($query);
		$xs=$this->db->results();
		return $xs;
		}
View-шка:
PHP:
echo "<pre>";
		print_r ($this->spot->showTree());
		echo "</pre>";
Получается вид:
PHP:
Array
(
    [0] => stdClass Object
        (
            [id] => 225
            [parent_id] => 223
            [name] => Ректификационные колонны
            [url="http:// => rekt_kolonni
        )

    [1] => stdClass Object
        (
            [id] => 226
            [parent_id] => 223
            [name] => Аламбики
            [url] => alambiki
        )

    [2] => stdClass Object
        (
            [id] => 227
            [parent_id] => 223
            [name] => Плиты и горелки
            [url] => pliti_gorelki_noindex
        )
...И тд


Не получается построить дерево, т.к. внутри массива объект. Готовые решения из-за этого не подходят. Если кто может - прошу помочь сделать функцию для перебора массива и построения дерева в таком виде:

PHP:
1.Слово
 1.1 Слово
  1.1.1 Слово
2.Слово
3.Слово
 3.1 Слово
1.Слово
 1.1 Слово
  1.1.1 Слово
2.Слово
3.Слово
 3.1 Слово
 

Фанат

oncle terrible
Команда форума
Никогда не понимал этих понтов с получением объекта из БД.
Найди в этой своей Simpla, как возвращать данные в виде обычного массива.
Если там такого нету, то просто не надо использовать эту поделку
 

Mecm

Новичок
Да я сам не понимал никогда, но организация так работает
 

ksnk

прохожий
А смарти не умеет работать с данными в виде объекта? Мне казалось, что от пристрастия к массивам они уже отошли.
 

Mecm

Новичок
Написал код:
PHP:
		function showTree($parentId){
			$sdd_db_host='192.168.0.77';// ваш адрес где находится, хостится ваша база данных
			$sdd_db_name='cosmo_for_noobs';// Имя базы данных с которой вы хотите работать, так как их может быть множество
			$sdd_db_user='root';// логин доступ к базе данных
			$sdd_db_pass='';// пароль доступа к базе данных
			@mysql_connect($sdd_db_host,$sdd_db_user,$sdd_db_pass);// устанавливаем связь с сервером
			@mysql_select_db($sdd_db_name);// переключаемся на нужную нам базу данных
			mysql_query('SET NAMES utf8');
			$result=mysql_query('SELECT * FROM `s_categories`');// делаем выборку из таблицы
			
			//$query = mysql_query("SELECT * from drevo");
			while($row=mysql_fetch_array($result)){
			$title = $row['name'];
			$pid = $row['parent_id'];
			$id = $row['id'];
			$op = $row['url'];
			$idd = $parentId;
			
			if($idd == $pid){
			echo "<li>$title";
			echo "<ul>";
			showTree($id);
			echo "</ul>";
			echo "</li>";
			}
		
		
		}
		}
		
		
		showTree (0);
		
		?>
Выводит прекрасное большое дерево:). Но требуется его разбить на много деревеьев для каждого раздела чтобы было своё. Прошу помощи.
 

Фанат

oncle terrible
Команда форума
Не понял. А где тут смарти?

И - боже - что тут делает SET NAMES и прочая?
 

Mecm

Новичок
Не понял. А где тут смарти?

И - боже - что тут делает SET NAMES и прочая?
Я переписал без использования смарти. Просто скрипт. Set Names для вывода в нормальном виде, кодировка текста. Теперь надо чтобы создавалось много маленьких деревьев для каждого раздела/подраздела.
 

Фанат

oncle terrible
Команда форума
Теперь надо с гримасой отвращения двумя пальцами взять весь mysql код, и выкинуть его куда-нибудь подальше, чтобы никто никогда его не увидел.
И передать в функцию массив.

А потом взять функцию из примера в документации по смарти и сделать по-человечески.
 

Mecm

Новичок
Теперь надо с гримасой отвращения двумя пальцами взять весь mysql код, и выкинуть его куда-нибудь подальше, чтобы никто никогда его не увидел.
И передать в функцию массив.

А потом взять функцию из примера в документации по смарти и сделать по-человечески.
А если без смарти извратиться - возможно?
 

Mecm

Новичок
Всё это дерево будет использоваться не для вывода на сайте, а для формирования нескольких xml файлов для Яндекс-остров. В этом дело.
 

Фанат

oncle terrible
Команда форума
С таким-то кодом (а я, каюсь, только сейчас весь ужас разглядел) тебе не саркастические замечания отпускать а с базой данных учиться работать.

Для начала стоит освоить оператор WHERE
 

ksnk

прохожий
Оно точно выводит дерево? И нигде-нигде не циклится?
parentId не участвует в выборе данных. Данные каждый раз выводятся одни и те же. Такое вот дерево?
 

Mecm

Новичок
С таким-то кодом (а я, каюсь, только сейчас весь ужас разглядел) тебе не саркастические замечания отпускать а с базой данных учиться работать.

Для начала стоит освоить оператор WHERE
Прости дядь, не я кашу заварил.

Оно точно выводит дерево? И нигде-нигде не циклится?
parentId не участвует в выборе данных. Данные каждый раз выводятся одни и те же. Такое вот дерево?
Грамотное хорошее, нужное мне дерево выводит. parentid и pid надо не путать. Код не мой, сам путался в этом моменте.
 

keltanas

marty cats
Mecm
Если ты готов сам подумать, а не только готовые решения тырить, то вот тебе пища:

Тебе надо один раз дернуть все данные, из которых будешь строить дерево, и потом составить из них массив, проиндексированный по parent_id (это 1 проход):
PHP:
[
    233 => [
        [
            id => 225
            parent_id => 223
            name => Ректификационные колонны
            url => "http:// => rekt_kolonni"
        ],
        [
            id => 226
            parent_id => 223
            name => Аламбики
            url => alambiki
        ]
    ],

    225 => [
        [
            id => 227
            parent_id => 225
            name => Плиты и горелки
            url => pliti_gorelki_noindex
        ]
    ]
и потом написать рекурсивную функцию, которая пройдет по твоему индексу и нарисует дерево (это уже можно сделать хоть на Smarty).

Вот тебе колесо от велосипеда:
PHP:
{function recursiveMenu level=0 parent=0 data=array()}

    {if $level>=0 && isset( $data[$parent] )}
        <ul class="level{$level} parent{$parent}">

            {$first = 1}
            {foreach from=$data[$parent] item="item"}
                {if !$item->hidden}
                    <li class="item{$item->id}{if $item->active} active{/if}{if $first} first{/if}">
                        {a href=$item->alias nofollow=$item.nofollow}{$item->name}{/a}
                        {if $level >= 0 && isset( $data[ $item->parent ] ) && $data[ $item->parent ]}
                            {recursiveMenu data=$data parent=$item->id level=$level-1}
                        {/if}
                    </li>
                    {$first = 0}
                {/if}
            {/foreach}
        </ul>
    {/if}

{/function}

{recursiveMenu data=$parents level=$level parent=$parent}
 
Сверху