LINUX.ORG.RU

Определить parent

 ,


0

1

tree.conf

Главная
 О_клинике
  Структура
  Лицензии_и_сертификаты
  Фотогалерея
  Вакансии
 Специалисты
 Услуги_и_Цены
 Пациентам
  Подготовка_к_исследованиям
  Перезвоните_мне
 Корпаративным_клиентам
  Врач_офиса
 Контакты
Прочесть файл и загнать сюда:
...
 /**
     * Добавление элемента в дерево
     * @param mixed $id
     * @param mixed $parent
     * @param mixed $data
     * @return void
     */
    public function addItem($id , $parent = 0 , $data) {
       ...
    }
...
Прощу помощи с определением parent

★★★★★

Последнее исправление: petav (всего исправлений: 1)

    /**
     * Получение родительского элемента в дереве
     * @param mixed $id
     * @param mixed $data
     * @return mixed $parent|false
     */
    public function getParent($id , $data) {
       ...
    }

Искренне ваша.

anonymous
()
Ответ на: комментарий от petav

Сидел бы ты молча со своим знанием. Есть что сказать скажи!?

Я использую nested sets для хранения данных подобного рода и сплю спокойно. Не нравится совет? ССЗБ. Я только лучше тебе хочу сделать, а не троллить тут и прочее.

resurtm ★★★
()
Последнее исправление: resurtm (всего исправлений: 1)
Ответ на: комментарий от resurtm

Задача - дерево в файле храниться, нужно загнать в массив, но при этом найти parent! По-моему так я и написал выше.

petav ★★★★★
() автор топика

А в чем, собственно, проблема? Перебери по строкам с рекурсией, в случае если изменяется глубина вложенности. Глубину вложенности регулируй через: strlen($line) - strlen(ltrim($line));, в рекурсивную функцию передавай массив из файла, текущую глубину и текущий индекс, на выход - подмассив [items] текущего элемента.

В итоге получишь что-то типа:

array(
  [id]=>0
  ['title']=>Бла бла
  [items]=>array(
    [id]=>1
    ['title']=>Под Бла бла
    [items]=>array(...)
  )
)
BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Глубина вложенности может меняться как в сторону увеличения, так и уменьшения. Что то-то я не пойму идею с

Перебери по строкам с рекурсией

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

Допустим я получил массив

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => Главная
        )

    [1] => Array
        (
            [0] => 1
            [1] => О_клинике
        )

    [2] => Array
        (
            [0] => 2
            [1] => Структура
        )

    [3] => Array
        (
            [0] => 2
            [1] => Лицензии_и_сертификаты
        )

    [4] => Array
        (
            [0] => 2
            [1] => Фотогалерея
        )

    [5] => Array
        (
            [0] => 2
            [1] => Вакансии
        )

    [6] => Array
        (
            [0] => 1
            [1] => Специалисты
        )

    [7] => Array
        (
            [0] => 1
            [1] => Услуги_и_Цены
        )

    [8] => Array
        (
            [0] => 1
            [1] => Пациентам
        )

    [9] => Array
        (
            [0] => 2
            [1] => Подготовка_к_исследованиям
        )

    [10] => Array
        (
            [0] => 2
            [1] => Перезвоните_мне
        )

    [11] => Array
        (
            [0] => 1
            [1] => Корпаративным_клиентам
        )

    [12] => Array
        (
            [0] => 2
            [1] => Врач_офиса
        )

    [13] => Array
        (
            [0] => 1
            [1] => Контакты
        )

)
Теперь вместо уровня вложенности [x][0] установить parent.

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

просто определи его на бумажке, запиши и формализируй свои шаги. превращай дерево в плоский массив в флагом типа элемента лист/ветка

trashymichael ★★★
()
Ответ на: комментарий от petav

суть тут в том, по-моему, что парента ты сам должен указывать, и в твоей структуре парент долежн явно быть указан, ты не должен его определять, ты должен его задавать

trashymichael ★★★
()

Парсишь строку. Считаешь кол-во пробелов. Если кол-во пробелов == 0, то кладешь в массив. Если кол-во пробелов на следующей строке больше, чем в предыдущей кладешь в подмассив предыдущего массива. В чем проблема?

VirRaa ★★★
()
Ответ на: комментарий от trashymichael

если что во втором посте готовая функция, все как ты хотел

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

тебе код готовый выложить? говна по всей морде не хочешь? на вот http://stackoverflow.com/questions/2504685/php-find-parent-key-of-array

Алгоритм записанный на алгоритмическом языке и по поставленной задаче. И да, я тебе не умолял о помощи, иди своей дорогой. Я поверю, что ты знаешь как задачу решить.

petav ★★★★★
() автор топика
Ответ на: комментарий от VirRaa

а если меньше, куда класть? Вот здесь у меня загвоздка.

petav ★★★★★
() автор топика
Последнее исправление: petav (всего исправлений: 1)

Прочесть файл и загнать сюда:

1. Заводишь переменную parent = 0
2. Читаешь строку из файла
3. Для первой строки parent = 0
4. Если прочитаная строка на уровень выше предыдущей, присваиваешь новый parent = предыдущей, если уровень равен, оставляешь старый, если уровень ниже, берешь парент от parent из уже заполненого массива
5. Заносишь через addItem

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

4. Если прочитаная строка на уровень выше предыдущей

А если на уровень ниже или на 4 уровня ниже?

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

А если на уровень ниже или на 4 уровня ниже?

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

BaBL ★★★★★
()
Ответ на: комментарий от goingUp

Этот алгоритм не обработает:

1
  1.1
  1.2
    1.2.1
    1.2.2
        1.2.2.1
2

На 2 запнется, ибо на 1.2.2.1 парент парента будет 1.2!?

petav ★★★★★
() автор топика
Ответ на: комментарий от petav

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

А старший уровень не факт, что будет связан с следующем элементом списка. Разрыв может быть в несколько уровней. Это в плюс уровни поднимаются итеративно, а в минус уровень может стремительно уходить. Не сочти за наглость, изложи в коде, там всего пять строк.

petav ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.