Я несколько озадачен сериализацией ассоциативного массива PHP - PullRequest
0 голосов
/ 29 октября 2008
a:3:{i:0;i:4;i:1;i:3;i:2;i:2;}

Правильно ли мне сказать, что это массив размера 3, в котором пары значений ключа: 0->4, 1->3 и 2->2?

Если это так, я нахожу это представление очень запутанным. Сначала я думал, что это список значений (или массив содержал {0, 4, 1, 3, 2, 2}), но я решил, что a:3: это размер массива. И если 3 был размер, то и ключи и значения появлялись в скобках без возможности четко определить пару ключ / значение без отсчета.

Чтобы уточнить, откуда я:

Почему разработчики PHP решили сериализовать таким образом? Какое преимущество это имеет, скажем, как var_dump и / или var_export отображают свои данные?

Ответы [ 4 ]

5 голосов
/ 29 октября 2008

Да, это array(4, 3, 2)

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

Edit: Это не слишком запутанно, когда вы к этому привыкнете, но это может быть несколько затянуто по сравнению, например, с JSON

Примечание: var_export () не обрабатывает круговые ссылки, как это было бы близко к невозможному генерировать Разбор PHP-код для этого. если ты хочу сделать что-то с полным представление массива или объекта, используйте serialize ().

3 голосов
/ 29 октября 2008
$string="a:3:{i:0;i:4;i:1;i:3;i:2;i:2;}";
$array=unserialize($string);
print_r($array);

outpts:

Array
(
    [0] => 4
    [1] => 3
    [2] => 2
)

Если подумать, дело в том, что PHP не делает различий между целочисленными индексированными массивами и строковыми индексированными хеш-таблицами. Формат сериализации можно использовать для хеш-таблиц точно так же: a:<<size>>:{<<keytype>>:<<key>>;<<valuetype>>:<<value>>;...}

Поскольку формат предназначен не для удобства чтения человеком, а скорее для обеспечения общего формата для представления всех типов переменных PHP (за исключением ресурсов), я думаю, что использовать данный формат проще, поскольку базовая переменная может быть восстановлена читая строку символ за символом.

1 голос
/ 29 октября 2008

Сериализованные данные PHP на самом деле не предназначены для восприятия человеком - насколько я знаю, это не цель этого формата.

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

0 голосов
/ 29 октября 2008

Почему бы вам не использовать функцию unserialize () , чтобы восстановить данные, как это было раньше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...