Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивный вывод в многомерноый массив
 
 автор: name   (14.06.2007 в 00:41)   письмо автору
 
 

Строю древовидное меню. Инфу беру из БД. Структура такая:

id
parent_id
title


Пробегаюсь рекурсивной функцией по базе и вывожу его

<?php

function recur($id
{
        
$query "SELECT * FROM menu WHERE parent_id = '$id'";
        
$result mysql_query($query); 
        
        if (
$result && mysql_num_rows($result) > 0
        {
              while(
$row mysql_fetch_array($result))
              {
                echo 
"<blockquote>{$row['title']}";
                
recur($row['id']);
                echo 
"</blockquote";
              }
        }
}
      
recur(0);

?>


Подскажите пожалуйста, как можно пару значений - id/title запехнуть в массив вида


<?php

$tree 
= array('dir1'=>
                        array(
'file1'=>'file',
                              
'file2'=>'file'),
              
'dir2'=>
                        array(
'dir2.1'=>
                                          array(
'file2.1'=>'file',
                                                
'file2.2'=>'file'),
                              
'file1'=>'file',
                              
'file2'=>'file'),
              
'file1'=>'file');

?>

   
 
 автор: Trianon   (14.06.2007 в 09:32)   письмо автору
 
   для: name   (14.06.2007 в 00:41)
 

Покажите, пожалуйста, структуру и данные таблицы, из которой построен этот массив.

   
 
 автор: name   (14.06.2007 в 10:11)   письмо автору
 
   для: Trianon   (14.06.2007 в 09:32)
 

Я хочу подогнать вывод под такой массив, а нужно мне это для того, чтобы потом построить многоуровневое меню.

Массив этот я взял из темы: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=36471

Подскажите пожалуйста - это реально или можно еще каким-нибудь способом сделать многоуровневое меню

   
 
 автор: Trianon   (14.06.2007 в 10:14)   письмо автору
 
   для: name   (14.06.2007 в 10:11)
 

Это реально, если Вы составите короткий пример данных, которые есть на входе и которые получаются на выходе.

Не "выглядит похоже как на это " а "в точности такой".

   
 
 автор: name   (14.06.2007 в 10:21)   письмо автору
 
   для: Trianon   (14.06.2007 в 10:14)
 

вход (БД)

id |  title               | text                            | parent_id
 1    Каталог               Текст в каталоге                    0
 2       Вибродиагностика      Текст о вибродиагностике           1
 3       Переносная          Текст о переносной установке       2
 4       Стендовая          Текст о стендовой установке       2
 5       Балансировка          Текст о балансировке               1
 6       Стационарная          Текст о стационарной установке      5


на выходе получаю:

Каталог
    Вибродиагностика
        Переносная
        Стендовая
    Балансировка
        Стационарная

или я не правильно Вас понял?

   
 
 автор: Trianon   (14.06.2007 в 10:27)   письмо автору
 
   для: name   (14.06.2007 в 10:21)
 

На выходе получаете

$tree = array
(


);

Заполните строки между скобками - для этого набора данных.

   
 
 автор: name   (14.06.2007 в 10:40)   письмо автору
 
   для: Trianon   (14.06.2007 в 10:27)
 


$out = array('каталог' =>
                         array('вибродиагностика' =>
                                                      array('переносная',
                                                          'стендовая'),
                               'балансировка'       =>
                                                    array('стационарная')
                              ),
             );

   
 
 автор: Trianon   (14.06.2007 в 11:09)   письмо автору
 
   для: name   (14.06.2007 в 10:40)
 

Я, конечно, могу построить код, который бы построил такой массив...
Но хотелось бы убедиться, что Вы написали именно то, что имеете в виду.

id | title     | parent_id | коментарий 
 1   Каталог             0  создал array с ключом 'Каталог'          и значением array 
 2    Вибродиагностика   1  создал array с ключом 'Вибродиагностика' и значением array
 3     Переносная        2  создал array с ключом 0                 и значением 'Переносная'
 4     Стендовая         2  создал array с ключом 0                  и значением 'Стендовая'
 5    Балансировка       1  создал array с ключом 'Балансировка'     и значением array
 6     Стационарная      5  создал array с ключом 0                  и значением 'Стационарная'

Работать с таким массивом будет ой как непросто.

   
 
 автор: name   (14.06.2007 в 11:12)   письмо автору
 
   для: name   (14.06.2007 в 10:40)
 

вот, что пока у меня получилось:

1) то меню, которое мне нужно (на дивах) - http://unicorn-studio.ru/testzone/reqursia
но оно ограничено по вложенности

2) tigra menu - http://unicorn-studio.ru/testzone/tree_menu
но мне требуется, чтобы по дизайну оно было, как первое. Сейчас переделываю, ну что-то не получается

Может быть Вам ссылки помогут представить, как должны строиться массивы

   
 
 автор: Trianon   (14.06.2007 в 11:19)   письмо автору
 
   для: name   (14.06.2007 в 11:12)
 

мне поможет, если Вы составите пример. Работающий. У Вас.
Неужели это так трудно?

   
 
 автор: name   (14.06.2007 в 11:26)   письмо автору
 
   для: Trianon   (14.06.2007 в 11:19)
 

Я не знаю как правильно должна идти последняя ветка, так

$out = array('каталог' =>
                         array('вибродиагностика' =>
                                                      array('0' => 'переносная',
                                                          '1' => 'стендовая'),
                               'балансировка'       =>
                                                    array('0' => 'стационарная')
                              ),
             ); 

или так

$out = array('каталог' =>
                         array('вибродиагностика' =>
                                                      array('0' => 'переносная',
                                                          '1' => 'стендовая'),
                               'балансировка'       =>
                                                    array('2' => 'стационарная')
                              ),
             ); 

Может быть Вы знаете, как правильно?

   
 
 автор: Trianon   (14.06.2007 в 11:41)   письмо автору
 
   для: name   (14.06.2007 в 11:26)
 

может быть так?

$out = array('каталог' => 
                         array('вибродиагностика' => 
                                                      array('переносная' =>array() , 
                                                           'стендовая' =>array() ), 
                               'балансировка'       => 
                                                    array('стационарная' =>array() ) 
                              )
             );  

Это было бы самым логичным.

   
 
 автор: name   (14.06.2007 в 11:48)   письмо автору
 
   для: Trianon   (14.06.2007 в 11:41)
 

Наверное, только, что будет в последних массивах - данные из бд по каждому из этих пунктов?

Посути, нужно чтобы у последних пунктов был id и title, чтобы можно было сформировать ссылку вида - <a href="index.php?action=menu&id=$id">$title</a>.

Какого вида должны быть последние вложения, я не знаю :(

   
 
 автор: Trianon   (14.06.2007 в 12:05)   письмо автору
 
   для: name   (14.06.2007 в 11:48)
 

ну если Вы не знаете, то я - тем более :))

   
 
 автор: name   (14.06.2007 в 12:07)   письмо автору
 
   для: Trianon   (14.06.2007 в 12:05)
 

а такой, можно?

$out = array('каталог' =>
                         array('вибродиагностика' =>
                                                            id       title
                                                      array('0' => 'переносная',
                                                          '1' => 'стендовая'),
                               'балансировка'       =>
                                                    array('2' => 'стационарная')
                              ),
             ); 


подскажите пожалуйста и если да, то как

   
 
 автор: Trianon   (14.06.2007 в 12:42)   письмо автору
 
   для: name   (14.06.2007 в 12:07)
 


<?php   include 'config.inc.php';

  
$sql "SELECT id, id_parent AS pid, name FROM catalog ORDER BY pid, id";
  
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
  
$list = array();
  function 
create_tree($list$root)
  {
      
$res = array();
      
$x $list[$root];
      foreach(
$x as $k => $v)
      {
          
$res[$v] = isset($list[$k])
                   ? 
create_tree($list$k)
                   : array();
      }
      return 
$res;
  }
  if(
mysql_num_rows($res))
  {
    while(
$row mysql_fetch_assoc($res))
    {
      
$id   $row['id'];
      
$pid  $row['pid'];
      
$name $row['name'];

      if(!isset(
$list[$pid]))
          
$list[$pid] = array($id=>$name);
      else
          
$list[$pid][$id] = $name;
    }
  }

  
$out create_tree($list0);

  echo 
'<pre>';
  
print_r($out);
?>

   
 
 автор: Trianon   (14.06.2007 в 12:43)   письмо автору
 
   для: name   (14.06.2007 в 12:07)
 

нельзя.
Поскольку значений 0 1 2 нет в соответствующих строках таблицы.

   
 
 автор: Trianon   (14.06.2007 в 12:43)   письмо автору
 
   для: name   (14.06.2007 в 12:07)
 

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

   
 
 автор: name   (14.06.2007 в 15:58)   письмо автору
 
   для: Trianon   (14.06.2007 в 12:43)
 

Большое спасибо за помощь, Trianon!

Может Вы сталкивались с подобной задачей, знаете еще какие-нибудь скрипты (решения) и можете посоветовать как быть?

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

   
 
 автор: Trianon   (14.06.2007 в 16:10)   письмо автору
 
   для: name   (14.06.2007 в 15:58)
 

ну....если вопрос стоит именно так - вот темы, в которых я что-то советовал:
http://softtime.ru/forum/srchform.php?id_forum=3&name=Trianon+tree&numberthemes=30&srchwhere=2&logic=1

   
 
 автор: Trianon   (14.06.2007 в 16:11)   письмо автору
 
   для: name   (14.06.2007 в 15:58)
 

.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования