За последние 24 часа нас посетили 18029 программистов и 1651 робот. Сейчас ищут 2107 программистов ...

Помогите с массивами

Тема в разделе "PHP для новичков", создана пользователем Vladsss, 14 ноя 2008.

  1. Vladsss

    Vladsss Активный пользователь

    С нами с:
    17 июн 2007
    Сообщения:
    22
    Симпатии:
    0
    Есть таблица состоящая из трех столбцов. Первый 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 равным количетсву подзаголовков. При большом количестве данных скрипт реально подвисает. Как мне кажется нужно вогнать в массив, чтобы каждый раз не обращаться к базе. А использовать один раз созданный массив. Может кто то посоветует другой способ еще, или поможет сформировать такой массив...
     
  2. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    1. Можно структуру таблицы (какие поля для чего)?
    2. Выводить в виде дерева из двух уровней (или больше)? Заголовок, подзаголовок ?

    ps: вообще да, надо грабить в массив и потом его вертеть.
     
  3. free-bits

    free-bits Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    296
    Симпатии:
    0
    Адрес:
    г. Красноярск
    sql запрос вроде и так возвращает массив. Просто надо 'склеить' в теле цикла полученные из запросов массивы и получить один большой многомерный массив, ИМХО
     
  4. free-bits

    free-bits Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    296
    Симпатии:
    0
    Адрес:
    г. Красноярск
    PHP:
    1.  
    2. $q_heads = mysql_query("SELECT id, a1, text FROM table WHERE a1 = 0");
    3. while ($heads = mysql_fetch_array($q_heads)){
    4.  
    5. $res[] = $heads;
    6. $q_items = mysql_query("SELECT id, a1, text FROM table WHERE a1 = ".$heads['id']);
    7. while ($items = mysql_fetch_array($q_items)){
    8. $res[] = $items;
    9. }
    10. }
    11.  
    Получаем один многомерный массив $res
     
  5. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    И целую кучу SQL-запросов.
     
  6. free-bits

    free-bits Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    296
    Симпатии:
    0
    Адрес:
    г. Красноярск
    Столько же сколько строк в таблице=) не думаю что их число както можно сократить
     
  7. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Вот такой велосипед (зато 1 SQL-запрос):
    PHP:
    1. <?php
    2. // Работает только для 2 уровней: Узел - Подузел
    3.  
    4. $cursor = mysql_query("SELECT * FROM tbl ORDER BY a1, id");
    5. $rows   = array();
    6.  
    7. while ($row = mysql_fetch_assoc($cursor)) {
    8.     if ($row["a1"] == 0) {
    9.         $row["children"]  = array();
    10.         $rows[$row["id"]] = $row;
    11.     } else {
    12.         $rows[$row["a1"]]["children"][] = $row;
    13.     }
    14. }
    15.  
    16. $result = array();
    17. foreach ($rows as $row) {
    18.     $result[] = $row;
    19.     $result = array_merge($result, $row["children"]);
    20. }
    21.  
    22. print_r($result);
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Vitas
    array_values() ;)
     
  9. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Mr.M.I.T., в смысле?
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    мб нужно $result=array_values($rows)
    ?

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

    Код (Text):
    1. array(
    2. [0]=>array (
    3.             [txt]=>загаловок 1
    4.             [id]=>id загаловка
    5.             [a1]=>0
    6.             [children]=>array (
    7.  
    8.                     [0]=>array
    9.                         (
    10.                             [txt] =>подзагаловок 1
    11.                             [id] => id подзагаловка
    12.                             [a1] => его a1
    13.                         )
    14.  
    15.                     [1]=>array
    16.                         (
    17.                             /* ..... */
    18.                         )
    19.  
    20.                 )
    21.  
    22.         )
    23.  
    24.    [1]=>array
    25.              (
    26.                [txt] =>подзагаловок 1
    27.                [id] => id подзагаловка
    28.                [a1] => его a1
    29.              )
    30.  
    31.    [2]=>array
    32.             (
    33.                /* ..... */
    34.             )
    35.    [3]=>array(
    36.            /* и тд */
    37.         )
    38.  
    39. )
     
  11. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Да нет, всё верно, просто я не удалил кое-какой "мусор", правильный код такой:
    PHP:
    1. <?php
    2. // Работает только для 2 уровней: Узел - Подузел
    3.  
    4. $cursor = mysql_query("SELECT * FROM tbl ORDER BY a1, id");
    5. $rows   = array();
    6.  
    7. while ($row = mysql_fetch_assoc($cursor)) {
    8.     if ($row["a1"] == 0) {
    9.         $row["children"]  = array();
    10.         $rows[$row["id"]] = $row;
    11.     } else {
    12.         $rows[$row["a1"]]["children"][] = $row;
    13.     }
    14. }
    15.  
    16. $result = array();
    17. foreach ($rows as $row) {
    18.     $children = $row["children"];
    19.     unset($row["children"]);
    20.     $result[] = $row;
    21.     $result = array_merge($result, $children);
    22. }
    23.  
    24. print_r($result);
    PS: громоздкий какой код получился, однако.