ФорумПрограммированиеPHP для идиотов → файл в массив

файл в массив

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 6 июня 2008 г. 7:19, спустя 1 час 3 минуты 39 секунд

    Потребуются регулярки и рекурсия

    А что, если пойти другим путем. Вместо массива в аргументе ф-ции будет запрос:
    $zapros = 'test.x';
    $m = file_get_contents('test.txt');
    $z = explode('.', $zapros);
    foreach ($z as $y)
    {
    preg_match('#<' . $y . '>(.*?)</' . $y . '>#si', $m, $m);
    $m = $m[1];
    }
    echo $m;

    Но всеравно не получается у меня сделать так, чтобы при запросе 'x' (сам блок «x» вложен в блок «test») вызывало ошибку, типа нету такого блока и т.п (тоесть доступ к элементу только через родителя). Подскажите как доделать?))
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 13 июня 2008 г. 5:22, спустя 6 дней 22 часа 2 минуты

    Ну ПОМОГИТЕ ЛЮДИ ДОБРЫЕ!!!!
    Вот что я сделал, помогите доделать!!
    $xxx = file_get_contents('1.txt');
    function bla($xxx)
    {
    global $ZOOM;
    preg_match_all('#<(.+?)>(.+?)</\\1>#si', $xxx, $yyy, PREG_SET_ORDER);
    foreach ($yyy as $val)
    {
    $ZOOM[$val[1]][] = $val[2];
    bla($val[2]);
    }
    }
    bla($xxx);
    print_r($ZOOM);

    HELP!)
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 13 июня 2008 г. 7:25, спустя 2 часа 2 минуты 48 секунд

    это не обеспечет тебе ограничения доступа

    итак предположим у тебя есть файл


    [root]

    [sub2]
    text
    [/sub2]

    [/root]


    его обрабатывает класс


    class{
    public function __constructor($file){
    $file = file_get_contents($file);
    $obj = $this->addNode($file)
    }
    private function addNode($node, $text){
    preg_match_all('#\[(.+?)\](.+?)\[/\\1\]#si', $file, $match);
    $node = new Node();
    foreach ($match as $item){
    $node->add($match[0],$this->addNode($match[1]));
    }
    if(!$match)
    $node->add($text);
    return $node;
    }
    }


    и класс ноды

    class Node{
    private $nodes = array();
    public function add($id,$node){
    if($node)
    $this->nodes[$id] = $node;
    else
    $this->nodes[] = $id;
    }
    public function get($id){
    return $this->nodes[$id];
    }
    }


    вобщем чтото типа этого
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 13 июня 2008 г. 7:51, спустя 26 минут 28 секунд

    Ты бы на словах объяснил)))
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 13 июня 2008 г. 7:56, спустя 5 минут 2 секунды

    тебе на каждый узел в иерархии надо делать свой обьект который содержить массив детей

    тогда доступ к третему уровню будет

    $node->get('root')->get('sub')->get('sub2')


  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 13 июня 2008 г. 8:07, спустя 10 минут 29 секунд

    Понял. А можно ли это все реализовать одним классом? Я недавно пытался понять как это работает в XTemplate, но ничего не понял(
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 13 июня 2008 г. 12:17, спустя 4 часа 10 минут 5 секунд

    А можно ли это все реализовать одним классом?


    не вижу смысла даже пытаться пробовать
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 14 июня 2008 г. 4:29, спустя 16 часов 12 минут 17 секунд

    не, ну хмл конечно лучше, вполне можно свести к нему. но от нефиг делать можно и свой класс написать. что-нить вроде этого для твоего случая подойдёт.
    <?php
    /* $txt - текст, который надо распарсить\
    * $struct - структура ключей, к которой относится текст на данном этапе парсинга.
    * $res - результирующий массив, передаётся по ссылке
    */
    class myXML{
    private static $SYMB = array('[', ']', '/');
    private static $PATTERN_KEY = '/^\w*$/';

    public function __construct($txt){
    $this->txt = trim($txt);
    $this->struct = array();
    $this->res = array();
    }

    public function parceText() {
    $this->openKey();
    if (substr($this->txt,0,2)==self::$SYMB[0].self::$SYMB[2]) {
    $this->closeKey();
    } elseif (substr($this->txt,0,1)==self::$SYMB[0]) {
    $this->parceText();
    } else {
    $this->setTxt();
    }
    }

    private function openKey() {
    // проверим правильность структуры файла - открытие ключа
    if (substr($this->txt,0,1) != self::$SYMB[0] ) {
    throw new Exception('Неверный формат файла');
    }

    // проверим правильность структуры файла - закрытие ключа
    $pos = strpos($this->txt, self::$SYMB[1] );
    if (!$pos) {
    throw new Exception('Неверный формат файла');
    }

    $key = substr($this->txt, 1, $pos-1);
    // проверим правильность структуры файла - допустимый формат ключа
    if (!preg_match(self::$PATTERN_KEY, $key)) {
    throw new Exception('Неверный формат ключа ' + $key);
    }

    // проверим правильность структуры файла - дубли ключа
    $co = count($this->struct);
    $tmp = $this->res;
    for ($i=0; $i<$co; $i++) {
    $tmp = $tmp[$this->struct[$i]];
    }
    if (isset($tmp[$key])) {
    throw new Exception('В ветке '.implode('-', $this->struct).'  имеются дубли ключа '.$key);
    }

    $this->struct[] = $key;
    $this->txt = trim(substr($this->txt, $pos+1));
    }

    private function setTxt(){
    $pos = strpos($this->txt, self::$SYMB[0]);
    $txt = substr($this->txt, 0, $pos);

    $key = array_pop($this->struct);
    $this->pushRes($key, $txt);

    $this->txt = substr($this->txt, $pos);
    $len = strlen($key)+3;
    if (substr($this->txt, 0, $len) != self::$SYMB[0].self::$SYMB[2].$key.self::$SYMB[1]) {
    throw new Exception('Не закрыт ключ '.$key.' в ветке '.implode('-', $this->struct));
    }
    $this->txt = substr($this->txt, $len+1);

    }

    private function pushRes($key, $txt){
    $struct = $this->struct;
    if (!count($this->struct)) {
    $this->res[$key] = $txt;
    } else {
    $this->res = $this->addResKey($key, $txt, $this->res, $this->struct);
    }

    }

    private function addResKey($key, $txt, $arr, $struct){
    if (!count($struct)) {
    $arr[$key] = $txt;
    return $arr;
    }
    $curKey = array_pop($struct);
    if (!isset($arr[$curKey])) {
    $arr[$curKey]= $this->addResKey($key, $txt, array(), $struct);
    } else {
    $arr[$curKey]= $this->addResKey($key, $txt, $arr[$curKey], $struct);
    }
    return $arr;
    }

    private $txt; // текущий текст, который надо обработать
    private $struct; // структура
    private $res; // результирующий массив
    }

    $obj = new myXML('[sss][sss]eeeee[/sss][/sss]');
    $obj->parceText();
    ?>

    есть ограничения - в значения полей не должны входить символы $SYMB[0] и $SYMB[1].
    хотя если подолбаться - и это можно обойти

    зы: CTAPbIu_MABP, квадратные колёса - это нечто))) бесполезное - но занимательное :)
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 14 июня 2008 г. 8:31, спустя 4 часа 2 минуты 12 секунд

    ghost,
    omg! Я уже сделал то, что хотел. Получилось компактнее :)
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 15 июня 2008 г. 10:39, спустя 1 день 2 часа 7 минут

    CTAPbIu_MABP, квадратные колёса - это нечто))) бесполезное - но занимательное :)


    http://upload.wikimedia.org/wikipedia/commons/6/64/Pyschoactive_Drugs.jpg


    $xml = str_replace ( array('[',']') , array('<','>') , "[sss][sss]eeeee[/sss][/sss]" )
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 15 июня 2008 г. 11:00, спустя 21 минуту 47 секунд

    Старый Мавр, не поверите, но я несколько постов тому назад предлагал переделать сий код в xml :-D
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 15 июня 2008 г. 12:16, спустя 1 час 15 минут 58 секунд

    KENDO, знаю, видел, тока человеку нравиться делать велосыпед с квадратными колесами, я такие тяжолые наркоти не принимаю)))
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 15 июня 2008 г. 15:51, спустя 3 часа 34 минуты 17 секунд


    http://upload.wikimedia.org/wikipedia/commons/6/64/Pyschoactive_Drugs.jpg


    Свой дневной запас сфоткал?)) [Шучу конечно :]
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 17 июня 2008 г. 1:21, спустя 1 день 9 часов 30 минут

    в каждой шутке есть только доля шутки…

    /* философски заметил Мавер дожёвывая гриб */

Пожалуйста, авторизуйтесь, чтобы написать комментарий!