За последние 24 часа нас посетили 34433 программиста и 1693 робота. Сейчас ищет 651 программист ...

Дерево

Тема в разделе "Вопросы от блондинок", создана пользователем dsda, 14 окт 2009.

  1. dsda

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

    С нами с:
    3 сен 2008
    Сообщения:
    34
    Симпатии:
    0
    Есть массив ([0]=>номер,[1]=>имя):
    1. name
    1.2. name
    2. name
    2.1.1. name
    2.2.1. name
    2.2.2. name
    3. name
    ...
    13. name
    13.1. name
    ...

    Из них надо сделать id,parent,name

    Я пробывал делать так:
    Код (Text):
    1. foreach ($cat as $k=>$v) {
    2.  $n[$k]=explode(".",trim($v[0]));
    3.  do {
    4.   /* а тут я не могу допереть как смотреть кто чей родитель
    5.  я предпологаю, что надо смотреть по цифрам номера начиная с первой, а как связать их с id в базе непонимаю...
    6.  */
    7.  } while ($i<count($n[$k]));
    8. }
     
  2. dsda

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

    С нами с:
    3 сен 2008
    Сообщения:
    34
    Симпатии:
    0
    определил максимальную глубину вложенности, но как обрящаться к массиву $a[1]...[]='blah'... жесть... ничего вменяемого нету... вот показать дерево из уже имеющихся данных это просто а как такие данные создать нигде не нашел... помогите плиз...
     
  3. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    рекурсия.


    Хотя на самом деле в Х-мерном массиве смысла нет.
    Экран у тебя 2хмерный.

    Поэтому тебе достаточно линейного массива из узлов.
    Где каждый узел это в свою очередь массив из 3х элементов (хотя можно свести вообще до 2х. Глубина абсолютная или относительно предыдущего и значение)
    1. индекс/ключ (1.1, 13.1.1.5 и т.д.)
    2. собственно значение.
    3. глубина относительно предыдущего элемента.

    Код (Text):
    1. глубина0 |ключ. | значение |
    2. --глубина1-- | ключ1. | значение1
    3. ----глубина2---- | ключ2. | значение2
    4. ----глубина3---- | ключ3. | значение3
    5. --глубина4-- | ключ4. | значение4
    Для совсем экзотических случаев можешь еще хранить индекс родителя (4й элемент).
     
  4. dsda

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

    С нами с:
    3 сен 2008
    Сообщения:
    34
    Симпатии:
    0
    в задании у меня сказано, что надо сделать id, parent, name т.е. посчитать все относительно вышестоящего. на счет глубины я вообще не понимаю смысла в ней, хоть и читал про нестед трии. но ничего не понял.

    теоретически я понимаю как это все сделать, но вот на практике не получается =(
     
  5. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Тогда не понятен вопрос.

    Что конкретно не получается?
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    http://www.php.ru/forum/viewtopic.php?t=15029


    Кто будет parent для 1.2.2 ?

    Я бы рекурсией сделал
     
  7. dsda

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

    С нами с:
    3 сен 2008
    Сообщения:
    34
    Симпатии:
    0
    для 1.2.2 parent будет 1.2.
    спс за ссылку на видеокурс, смотреть точно не буду. потому как сомневаюсь что там объясняют логику построения алгоритмов.
     
  8. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мгм, логику построения алгоритмов не объясняют нигде :)

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

    PHP:
    1. <?php
    2. $array = array(
    3. '1.' => 0,
    4. '1.1.' => 100,
    5. '1.2.' => 200,
    6. '1.2.1.' => 300,
    7. '1.2.2.' => 400,
    8. '1.3.' => 500,
    9. '2.1.' => 600,
    10. '2.2.' => 700);
    11.  
    12. var_dump($array);
    13. $res= array();
    14. $tmp = &$res;
    15. foreach ($array as $keyMP => $nodeValue) {
    16.     $path = explode('.', $keyMP);
    17.     foreach($path as $nodeParent) {
    18.         if ($nodeParent != '' && isset($tmp[$nodeParent])) {
    19.             $tmp = &$tmp[$nodeParent];
    20.         } elseif($nodeParent == '') {
    21.             $tmp[] = $nodeValue;
    22.         } else {
    23.             $tmp[$nodeParent] = array();
    24.             $tmp = &$tmp[$nodeParent];
    25.  
    26.         }
    27.     }
    28.     $tmp = &$res;
    29. }
    30.  
    31. var_dump($res);