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

Статус
В этой теме нельзя размещать новые ответы.

dumber

Постоялец
Регистрация
23 Апр 2007
Сообщения
272
Реакции
124
Понадобилось решение для хранения разных конфиг данных в одном поле БД. Для этого удобно юзать 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, $result, PREG_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 для хранения собственных данных.
Надеюсь окажется полезным... :-]

Если чо понадобится обращайтесь ;)
 
M

masto

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

dumber

Постоялец
Регистрация
23 Апр 2007
Сообщения
272
Реакции
124
а не проще для этого было заюзать сериализацию или JSON и не устраивать шаманских плясок?

ну в каждом проекте по своему, иногда нужны функции с базовым PHP без лишних мулек :)
 
M

masto

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

Какие тут мульки?
 

dumber

Постоялец
Регистрация
23 Апр 2007
Сообщения
272
Реакции
124
так сериализация и есть функция самого PHP.
Обработка JSON также включена в ядро PHP с версии 5.2.

Какие тут мульки?

Хм, в 5.2 много чего включено изначально и PDO за всем не углядишь, кинь код плиз. Как то что выше реализовать легче с сериализацией и JSON?
 
M

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));

?>
 

dumber

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

masto

Прохожие
Первый случай с сериализацией не подходит поскольку у него нет ассоциативности - параметр key не сохраняется, а для конфига в БД он обязателен.
json не подошел птому что многоуровневые массивые не читает.
ты бредишь
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
 

dumber

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

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

gregzem

Гуру форума
Регистрация
21 Окт 2007
Сообщения
202
Реакции
66
Кстати serialize перед записью в БД лучше обрамлять еще и base64_encode, там могут быть символы с кодом < 32 и они не очень хорошо могут лечь в БД (если конечно поле не BLOB)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху