Как получить одно значение из сериализованных данных массива в php [duplicate]

Или другое решение.

"{:0>2}".format(number)
97
задан starkeen 9 June 2016 в 04:22
поделиться

9 ответов

Массив PHP или объект или другая сложная структура данных не могут быть перемещены или сохранены или использованы иным образом вне запущенного скрипта PHP . Если вы хотите, чтобы сохраняли такую ​​сложную структуру данных за пределами одного запуска скрипта, вам необходимо сериализовать . Это просто означает, что структура превращается в «более низкий общий знаменатель», который может обрабатываться другими вещами, кроме PHP, такими как базы данных, текстовые файлы, сокеты. Стандартная функция PHP serialize - это просто формат , чтобы выразить такую ​​вещь, она сериализует структуру данных в строковое представление, уникальное для PHP, и может быть изменено на PHP-объект с использованием unserialize. Существует много других форматов, таких как JSON или XML.


Возьмем, к примеру, эту общую проблему:

Как передать массив PHP javascript?

PHP и Javascript могут общаться только через строки. Вы можете легко передать строку "foo" в Javascript. Вы можете легко передать номер 1 в Javascript. Вы можете легко передавать логические значения true и false в Javascript. Но как передать этот массив в Javascript?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

Ответ - сериализация . В случае PHP / Javascript JSON на самом деле является лучшим форматом сериализации:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }

Javascript может легко изменить это на реальный массив Javascript.

Это так же верно, как представление одной и той же структуры данных:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

Но в значительной степени только PHP использует его, поддержка этого формата в другом месте немного. Это очень распространено и хорошо поддерживается, но:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>

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

129
ответ дан deceze 27 August 2018 в 00:13
поделиться

Большинство носителей хранения могут хранить типы string . Они не могут напрямую хранить структуру данных PHP, такую ​​как массив или объект, и они не должны, поскольку это будет связывать носитель данных с PHP.

Вместо этого serialize() позволяет вам хранить один этих структур как строка.

Если вы знакомы с json_encode() и json_decode() (и JSON в целом), концепция аналогична.

4
ответ дан alex 27 August 2018 в 00:13
поделиться

В основном, когда вы сериализуете массивы или объекты, вы просто превращаете их в допустимый строковый формат, чтобы вы могли легко хранить их вне сценария php.

  1. Используйте сериализацию, чтобы сохранить состояние объект в базе данных (позволяет взять класс User в качестве примера). Затем unserialize данные для загрузки предыдущего состояния обратно в объект (методы не являются сериализаторами, вам нужно включить класс объектов, чтобы иметь возможность использовать его) персонализация пользователя

Примечание для объекта вы должны использовать методы магии __sleep и __wakeup. __sleep вызывается serialize (). Метод sleep вернет массив значений из объекта, который вы хотите сохранить.

__ wakeup вызывается unserialize (). Метод пробуждения должен принимать неэтериализованные значения и инициализировать их в них в объекте.

Для передачи данных между php и js вы должны использовать json_encode, чтобы превратить php-массив в действительный формат json. Или наоборот: используйте JSON.parese () для преобразования выходных данных (строки) в действительный объект json. Вы хотели бы сделать это, чтобы использовать локальное хранилище. (автономный доступ к данным)

0
ответ дан Antoine 27 August 2018 в 00:13
поделиться

Пожалуйста! пожалуйста! пожалуйста! НЕ сериализуйте данные и поместите их в свою базу данных. Сериализация может использоваться таким образом, но в этом отсутствует точка реляционной базы данных и типы данных, присущие вашему движку базы данных. Это делает данные в вашей базе данных не переносимыми, трудночитаемыми и может усложнять запросы. Если вы хотите, чтобы ваше приложение было переносимым на другие языки, например, скажем, вы обнаружите, что хотите использовать Java для некоторой части вашего приложения, что имеет смысл использовать Java, сериализация станет болью в ягодицах. Вы всегда должны иметь возможность запрашивать и изменять данные в базе данных без использования стороннего посреднического инструмента для манипуляции данными, которые необходимо вставить.

очень сложно поддерживать код, код с проблемами переносимости и данные, которые сложнее переносить на другие системы RDMS, новую схему и т. д. Это также имеет дополнительный недостаток: найдите свою базу данных на основе одного из полей, которые вы сериализовали.

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

Хороший пример searilize () и unsearilize () может быть следующим:

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");

Неисследовать на странице

if($_GET['x']) {
   // unpack searilized and ecoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}
1
ответ дан Avnish alok 27 August 2018 в 00:13
поделиться
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Запустить эту программу для эхо-выхода

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}

здесь a = размер массива i = количество номеров массива s = размер значений массива

вы можете используйте сериализацию для хранения массива данных в базе данных и может извлекать и UN-serialize данные для использования.

2
ответ дан Machavity 27 August 2018 в 00:13
поделиться

Из http://php.net/manual/en/function.serialize.php :

Создает сохраняемое представление значения. Это полезно для хранения или передачи значений PHP без потери их типа и структуры.

По сути, он принимает php-массив или объект и преобразует его в строку (которую вы затем можете передать или сохранить по своему усмотрению).

Используется Unserialize для преобразования строки обратно в объект.

2
ответ дан MrGlass 27 August 2018 в 00:13
поделиться

Использование PHP serialize () unserialize ()

http://freeonlinetools24.com/serialize

echo '<pre>';
// say you have an array something like this 
$multidimentional_array= array(
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 4, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 5, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 8, 7) 
    )
);

// serialize 
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);

Что дает вам результат например

a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}

, если вы хотите вернуть исходный массив только с помощью функции PHP unserialize ()

$original_array=unserialize($serialized_array);
var_export($original_array);

Надеюсь, это поможет

22
ответ дан tipico 27 August 2018 в 00:13
поделиться

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

  **Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:

  history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)

Надеюсь, это вам поможет.

0
ответ дан user 27 August 2018 в 00:13
поделиться

Если вы хотите, чтобы ваше значение php сохранялось, вам нужно превратить его в строковое значение, то есть serialize () . И unserialize () делает обратную вещь.

6
ответ дан xdazz 27 August 2018 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: