Есть таблица состоящая из трех столбцов. Первый id, второй a1 где храняться числа. Третий txt текстовый с произовольным текстом. Если в a1 стоит 0 - данная строка является "заголовком", если другая цифра (может соответствовать id строки где в этом же стоблце стоит 0) значит эта строка является соответствующим "подзаголовком". Подзаголовок не может в таблице стоять "выше" своего заголовка то есть иметь меньшее id Как создать многомерный массив который выводил бы подряд все заголовки и соответствующии им подзаголовки. А также хранить данные всех соответсвующих полей. А также был бы доступ к соответствующим элементам массива через ключи id и mas_id То есть массив в виде mas_id=0;id=1,a1=0,txt=заголовок 1 mas_id=1;id=2,a1=1,txt=подзаголовок 1 mas_id=2;id=5,a1=1,txt=подзаголовок 2 mas_id=3;id=3,a1=0,txt=заголовок 2 mas_id=4;id=4,a1=3,txt=подзаголовок 3 Если проще в БД в одной таблице хранятся заголовки и подзаголовки некой структуры. Скрипт написан так что на одной странице нужно выводить несколько раз структуру описанную выше. Сейчас это делается выборкой из БД каждый раз с вложенными циклами. В первом цикле идут заголовки во вложенном ищутся подзаголовки с WHERE a1 равным количетсву подзаголовков. При большом количестве данных скрипт реально подвисает. Как мне кажется нужно вогнать в массив, чтобы каждый раз не обращаться к базе. А использовать один раз созданный массив. Может кто то посоветует другой способ еще, или поможет сформировать такой массив...
1. Можно структуру таблицы (какие поля для чего)? 2. Выводить в виде дерева из двух уровней (или больше)? Заголовок, подзаголовок ? ps: вообще да, надо грабить в массив и потом его вертеть.
sql запрос вроде и так возвращает массив. Просто надо 'склеить' в теле цикла полученные из запросов массивы и получить один большой многомерный массив, ИМХО
PHP: $q_heads = mysql_query("SELECT id, a1, text FROM table WHERE a1 = 0"); while ($heads = mysql_fetch_array($q_heads)){ $res[] = $heads; $q_items = mysql_query("SELECT id, a1, text FROM table WHERE a1 = ".$heads['id']); while ($items = mysql_fetch_array($q_items)){ $res[] = $items; } } Получаем один многомерный массив $res
Вот такой велосипед (зато 1 SQL-запрос): PHP: <?php // Работает только для 2 уровней: Узел - Подузел $cursor = mysql_query("SELECT * FROM tbl ORDER BY a1, id"); $rows = array(); while ($row = mysql_fetch_assoc($cursor)) { if ($row["a1"] == 0) { $row["children"] = array(); $rows[$row["id"]] = $row; } else { $rows[$row["a1"]]["children"][] = $row; } } $result = array(); foreach ($rows as $row) { $result[] = $row; $result = array_merge($result, $row["children"]); } print_r($result);
мб нужно $result=array_values($rows) ? потому что иначе будет такой примерно массив Код (Text): array( [0]=>array ( [txt]=>загаловок 1 [id]=>id загаловка [a1]=>0 [children]=>array ( [0]=>array ( [txt] =>подзагаловок 1 [id] => id подзагаловка [a1] => его a1 ) [1]=>array ( /* ..... */ ) ) ) [1]=>array ( [txt] =>подзагаловок 1 [id] => id подзагаловка [a1] => его a1 ) [2]=>array ( /* ..... */ ) [3]=>array( /* и тд */ ) )
Да нет, всё верно, просто я не удалил кое-какой "мусор", правильный код такой: PHP: <?php // Работает только для 2 уровней: Узел - Подузел $cursor = mysql_query("SELECT * FROM tbl ORDER BY a1, id"); $rows = array(); while ($row = mysql_fetch_assoc($cursor)) { if ($row["a1"] == 0) { $row["children"] = array(); $rows[$row["id"]] = $row; } else { $rows[$row["a1"]]["children"][] = $row; } } $result = array(); foreach ($rows as $row) { $children = $row["children"]; unset($row["children"]); $result[] = $row; $result = array_merge($result, $children); } print_r($result); PS: громоздкий какой код получился, однако.