XML в массив и массив в XML

Тема в разделе ".:: Готовые решения", создана пользователем dumber, 12 июл 2008.

Статус темы:
Закрыта.
  1. dumber

    dumber

    Регистр.:
    23 апр 2007
    Сообщения:
    272
    Симпатии:
    123
    Понадобилось решение для хранения разных конфиг данных в одном поле БД. Для этого удобно юзать xml стандарт запись <key>val</key> чтобы выдирать данные с БД по отдельным конфигам (с название key) нужен был класс для парснга этого xml кода, попробовал юзануть DOM оказалось это все равно что на танк Т80 плуг приделывать, пахать то будет но **х он такой нужен. Порыскал поинету выдалось куча классов, использующих черт зна какие мульки (тот же DOM только старой версии) чтобы не прарится ибо задача не сложная, написал 2 собственные функции по конвертации данных, вот собсно и они:

    PHP:

    public function ArrayToXML($array
        {
            
    $RetStr "";
            foreach(
    $array as $key=>$val)
            {
                if(
    is_array($val))
                {
                    
    $RetStr .= "<$key>".$this->ArrayToXML($val)."</$key>";
                    
                }
                else
                {
                    
    $RetStr .= "<$key>$val</$key>";
                }
            }
            return 
    $RetStr;
        }

        public function 
    XMLtoArray($xmlStr
        {
            
    $ArrRet = array();
            
    // Using regular expressions we are trying to get all tags and data
            
    preg_match_all("/<([^>]+)>(.*)<\/\\1>/is"$xmlStr$resultPREG_SET_ORDER);
            foreach(
    $result as $item)
            {
                if(
    preg_match("/<([^>]+)>(.*)<\/\\1>/is"$item[2]))
                {
                    
    $ArrRet[$item[1]] = $this->XMLtoArray($item[2]);
                }
                else
                {
                    
    $ArrRet[$item[1]] = $item[2];
                }
            }
            return 
    $ArrRet;
        }
    как видите кода мало, а пользы много (если вы конечно выбрали xml для хранения собственных данных.
    Надеюсь окажется полезным... :-]

    Если чо понадобится обращайтесь ;)
     
    AleksWhite нравится это.
  2. masto

    masto Прохожие

    а не проще для этого было заюзать сериализацию или JSON и не устраивать шаманских плясок?
     
  3. dumber

    dumber

    Регистр.:
    23 апр 2007
    Сообщения:
    272
    Симпатии:
    123
    ну в каждом проекте по своему, иногда нужны функции с базовым PHP без лишних мулек :)
     
  4. masto

    masto Прохожие

    так сериализация и есть функция самого PHP.
    Обработка JSON также включена в ядро PHP с версии 5.2.

    Какие тут мульки?
     
  5. dumber

    dumber

    Регистр.:
    23 апр 2007
    Сообщения:
    272
    Симпатии:
    123
    Хм, в 5.2 много чего включено изначально и PDO за всем не углядишь, кинь код плиз. Как то что выше реализовать легче с сериализацией и JSON?
     
  6. masto

    masto Прохожие

    смотри:
    есть массив с параметрами, скажем $param.
    для сохранения в БД - делаешь serialize($param), получаешь одну строку и результат пишешь в базу.
    для использования - читаешь строку с базы, делаешь unserialize($res) и получаешь назад свой массив.

    С JSON - тоже самое, только вместо serialize() и unserialize() используешь json_encode() и json_decode().

    И в БД занимает меньше места и работает быстрее и не надо сторонних функций :)

    вот тебе простой пример:
    PHP:
    <?php

    $a 
    = array('a' =>1,
                
    'd' => 2,
                
    'ds' => 'esgshsh',
                
    'v' => 4,
                
    'e' => 5
    );

    print_r($a);

    echo 
    $b serialize($a) . "\n";
    echo 
    $c json_encode($a) . "\n";

    print_r(unserialize($b));
    print_r(json_decode($c));

    ?>
     
  7. dumber

    dumber

    Регистр.:
    23 апр 2007
    Сообщения:
    272
    Симпатии:
    123
    попробовал и вот какие несоответствия нашел со своими потребностями.
    Первый случай с сериализацией не подходит поскольку у него нет ассоциативности - параметр key не сохраняется, а для конфига в БД он обязателен.
    json не подошел птому что многоуровневые массивые не читает. Можно было бы его использовать чтобы опять же создать те функции вызывая себя рекурсивно. Но зато мой код будет работать на более старых версиях PHP. :-]
     
  8. masto

    masto Прохожие

    ты бредишь
    PHP:
    <?php

    $a 
    = array('a' =>1,
                
    'd' => 2,
                
    'ds' => 'esgshsh',
                
    'v' => 4,
                
    'yy' => array('xx' => 123,
                                
    'xxx' => 'tttttt',
                                
    'zzz' => array('2a' => 'rrr',
                                                
    '2b' => 555
                                        
    )
                        ),
                
    'e' => 5
    );

    print_r($a);

    echo 
    $b serialize($a) . "\n";
    echo 
    $c json_encode($a) . "\n";

    print_r(unserialize($b));
    print_r(json_decode($c));

    ?>
    результат
    Код:
    Array
    (
        [a] => 1
        [d] => 2
        [ds] => esgshsh
        [v] => 4
        [yy] => Array
            (
                [xx] => 123
                [xxx] => tttttt
                [zzz] => Array
                    (
                        [2a] => rrr
                        [2b] => 555
                    )
    
            )
    
        [e] => 5
    )
    a:6:{s:1:"a";i:1;s:1:"d";i:2;s:2:"ds";s:7:"esgshsh";s:1:"v";i:4;s:2:"yy";a:3:{s:2:"xx";i:123;s:3:"xxx";s:6:"tttttt";s:3:"zzz";a:2:{s:2:"2a";s:3:"rrr";s:2:"2b";i:555;}}s:1:"e";i:5;}
    {"a":1,"d":2,"ds":"esgshsh","v":4,"yy":{"xx":123,"xxx":"tttttt","zzz":{"2a":"rrr","2b":555}},"e":5}
    Array
    (
        [a] => 1
        [d] => 2
        [ds] => esgshsh
        [v] => 4
        [yy] => Array
            (
                [xx] => 123
                [xxx] => tttttt
                [zzz] => Array
                    (
                        [2a] => rrr
                        [2b] => 555
                    )
    
            )
    
        [e] => 5
    )
    stdClass Object
    (
        [a] => 1
        [d] => 2
        [ds] => esgshsh
        [v] => 4
        [yy] => stdClass Object
            (
                [xx] => 123
                [xxx] => tttttt
                [zzz] => stdClass Object
                    (
                        [2a] => rrr
                        [2b] => 555
                    )
    
            )
    
        [e] => 5
    )
    как видишь и массив многомерный и ключи на месте.

    в общем, как я понял, ты следуешь девизу "Мы не ищем лёгких путей" :D удачи с XML:p
     
  9. dumber

    dumber

    Регистр.:
    23 апр 2007
    Сообщения:
    272
    Симпатии:
    123
    хм... мну многомерный не вышел за первый раз :(

    Да пофиг, я просто XML люблю сразу как узнал о нем :) уже привык все данные в таком формате писать.
     
  10. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    Кстати serialize перед записью в БД лучше обрамлять еще и base64_encode, там могут быть символы с кодом < 32 и они не очень хорошо могут лечь в БД (если конечно поле не BLOB)
     
Статус темы:
Закрыта.