Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> структура файла - дерево как читать? 
:(
    Опции темы
Sniper
Дата 21.5.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



файл представляет из себя дерево.
что-то типа 

somefunc1
табsub1
табsub2
табsub3
табтабsubtext1
табтабsubtext2
somefunc2

somefunc3

обычное деревце, через таб идут ветки. как читать (в массив)?
в обычных языках проблем нет, а в PHP как?
smile


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
skalex
Дата 21.5.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 0
Всего: 23



А как вы это делали в "обычных" языках?  smile 
PM   Вверх
Golda
Дата 21.5.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: 1
Всего: 42



Вы поставили слишком неконкретную задачу, Sniper. Какой массив? Какие к нему требования? Как с ним потребуется работать в дальнейшем?

Например, можно решить задачу так.

Код

<?php
$text = "somefunc1
\tsub1
\tsub2
\tsub3
\t\tsubtext1
\t\tsubtext2
somefunc2

somefunc3";

$target = array();
$refs = array(&$target);
$text = str_replace(array("\r\n", "\n\r"), array("\n", "\n"), $text); 
foreach(explode("\n", $text) as $str) {
    if (($val = trim($str)) === '') continue;
    $level = 0;
    while (substr($str, $level++, 1) === "\t");
    while ($level < count($refs)-1) {
        array_pop($refs);
    }
    if ($level >= count($refs)) {
        $refs[count($refs)-1][$val] = array(); 
        array_push($refs, &$refs[count($refs)-1][$val]);
    } else {
        $refs[count($refs)-2][$val] = array();
        $refs[count($refs)-1] = &$refs[count($refs)-2][$val];
    }
    
}
echo '<pre>';
print_r($target);
echo '</pre>';

?>


и получить на выходе:

Код

Array
(
    [somefunc1] => Array
        (
            [sub1] => Array
                (
                )

            [sub2] => Array
                (
                )

            [sub3] => Array
                (
                    [subtext1] => Array
                        (
                        )

                    [subtext2] => Array
                        (
                        )

                )

        )

    [somefunc2] => Array
        (
        )

    [somefunc3] => Array
        (
        )

)


Это то, что Вам было нужно? Такой результат выглядит наиболее интуитивно и лаконично, но не учитывает, например, вариант, когда у Вас могут встретить несколько child для одного parent с одинаковым текстом.

Вкратце поясню, что я сделала. Результат накапливается в массиве $target. Массив $ref отслеживает ссылки на текущий активный путь в массиве $target, т.е. те элементы среди которых может оказаться "родитель" для следующего зачитываемого элемента. Если элемент уровнем ниже, он запишется "потомком" текущего и стек $ref прирастет новым элементом; если того же уровня, что послений активный, он сменит его в стеке; а если уровень выше, то из стека будет вырошены элементы, для которых уже все не может быть "дочерних" далее по разбору строки.

P.S. Все-таки интересно, а что Вы делали в "обычных языках" и какой результат получали? 

Это сообщение отредактировал(а) Golda - 21.5.2007, 18:18


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.