Как преобразовать объект в массив php
php автоматическое преобразование объекта в массив
Я хочу преобразовать мой объект класса в массив. Я уже задавал вопрос о том, как преобразовать объект в массив.
Но при этом мне было интересно, можем ли мы сделать что-то вроде этого:
Как я знаю, он преобразует объект в массив, но если есть какая-то определенная пользователем функция, в которой я могу управлять этим поведением и позволить нескольким членам передаваться в качестве ключей массива.
Например, скажем, у меня есть класс:
Выход:
Но я не хочу этот вывод, я хочу изменить этот вывод и хочу вывод, как это:
Таким образом, должен быть какой-то способ, которым я мог бы вызывать пользовательскую функцию, когда кто-то пытался type cast мои объекты класса, как это:
Когда кто-то использует следующее утверждение:
Если кто-нибудь знает какие-либо способы сделать что-то подобное, пожалуйста, помогите мне.
Если есть какие-либо другие решения, которые могут привести к тому же результату, было бы очень полезно.
Решение
Объекты поддерживают реализацию ArrayAccess интерфейс, который обрабатывает их как массивы другими способами, но не предоставляет метод для полного приведения.
Есть несколько доступных решений:
get_object_vars
Как уже упоминалось, публичные свойства могут быть преобразованы только с помощью get_object_vars метод, например
JsonSerializable
Интерфейс JsonSerializable позволяет применять пользовательскую логику к тому, что происходит, когда json_encode называется, что дает улучшение в том смысле, что позволяет включать частные или защищенные свойства или любую другую пользовательскую логику, которая у вас есть.
json_decode а также json_encode вызовы в вышеупомянутом могут, конечно, быть обернуты в некоторый простой синтаксический сахар, такой как
Однако все это не позволяет вам переопределить то, что происходит, когда вы используете само приведение массива. Надеемся, что однажды одно из предложений будет принято, но до тех пор это будут лучшие варианты.
Другие решения
использование json_decode() а также json_encode() преобразовать объект php в массив
Как преобразовать массив в объект в PHP?
Как я могу преобразовать такой массив в объект?
30 ответов:
в простейшем случае, вероятно, достаточно «бросить» массив в качестве объекта:
как Эдсон Медина указал, действительно чистое решение заключается в использовании встроенного json_ функции:
Это также (рекурсивно) преобразует все ваши суб массивы в объекты, которые вы можете или может не хочу. К сожалению, он имеет 2-3x производительность над циклическим подходом.
предупреждение! (спасибо Ultra за комментарий):
вы можете просто использовать приведение типов для преобразования массива в объект.
подделка реального объекта:
преобразуйте массив в объект, приведя его к объекту:
вручную преобразовать массив в объект:
не очень красиво, но работает.
но это не то, что вы хотите. Если вам нужны объекты, вы хотите чего-то достичь, но этого не хватает в этом вопросе. Использование объектов только по причине использования объектов не имеет смысла.
его путь к простому, это создаст объект для рекурсивных массивов, а также:
В зависимости от того, где вам это нужно и как получить доступ к объекту есть разные способы сделать это.
например: просто наберите его
однако наиболее совместимым является использование служебного метода (еще не являющегося частью PHP), который реализует стандартное PHP-кастинг на основе строки, указывающей тип (или игнорируя его, просто снимая ссылку на значение):
пример использования в вашем случае (онлайн Демо):
использование :
возвращает :
как обычно, вы можете зациклить его так:
там нет встроенного метода, чтобы сделать это, насколько я знаю, но это так же просто, как простой цикл:
вы можете изложить это, если вам нужно построить свой объект рекурсивно.
на самом деле, если вы хотите использовать это с многомерными массивами, вы хотели бы использовать некоторую рекурсию.
Я бы определенно пошел с чистым способом, как это:
Если вы представите:
Я нашел это более логичным, сравнивая приведенные выше ответы от объектов, которые должны использоваться для той цели, для которой они были сделаны (инкапсулированные милые маленькие объекты).
также с помощью get_object_vars убедитесь, что никакие дополнительные атрибуты не создаются в управляемом объекте (вы не хотите автомобиль, имеющий фамилию, ни человек, ведущий себя 4 колеса).
Делаем из массивов объекты
PHP содержит очень мощный инструмент — массивы. Половина функций в PHP возвращает результат как ассоциативные массивы. При работе с такими функциями легко допустить ошибки в именовании ключей массива. Понятно что для опытного разработчика это не составляет проблем, но для начинающих это частенько может стать головной болью, особенно если мы получаем огромный json или просто правим legasylegacy код, ну а для не программистов… (таких как я) может послужить генератором говнострашного кода.
Тут приведу некий трюк, который позволяет использовать массив как объект/коллекцию. Возможно кому то это покажется глупым, а кому то даст идеи для применения.
Сразу оговорюсь что реализация рабочая для PHPStorm, в других IDE нужно вам проверять.
Часть примеров будет взята с потолка, часть будет взята из Instagram api.
Примеры
Пример 1. Работаем с данными формы.
Ну и результат использования такого «класса»
Сразу видно с чем имеем дело.
Пример 2. Работаем с сессиями.
Нам нужно работать с сессиями максимально просто.
Наш класс:
Класс для сессий (код ArrayClass будет в конце):
Это нам позволяет спокойно работать так:
$s = new MySession();
$s->var1 = 10;
Всё просто и прозрачно.
Пример 3. Instagram, json и сложные массивы
Нам нужно вызвать API. Делаем это примерно так:
Как это выглядит в IDE:
В 2х словах. Мы получаем json от Instagram и заворачиваем его в наши классы. На выходе получаем структуру классов и помощь от нашей IDE.
Ну а теперь сам ArrayClass:
Вот что получаем на выходе:
Если у кого нибудь есть дополнения по использованию памяти и производительности прошу отписаться в комментариях. Спасибо.
Конвертирование массива в объект в PHP
В самом простом случаем преобразовать массив в объект в PHP можно следующим образом:
case ‘phone’:
$cmd = Phone:class;
case ‘pc’:
$cmd = PC:class
Но это в том случае, если массив одномерный. А что, в массиве есть еще другие массивы? В этом случае нам поможет рекурсия:
function arrayToObject($array)
<
$object = new stdClass();
return array2object($array,$object);
>
// многомерный массив
$array = [
‘hello’ => ‘1’,
‘open2’ => ‘2’,
‘object’ => [
‘obj’ => ‘inner’,
‘inner3’ => [
‘object3’ => ‘Inner’
]
]
];
// вызываем
$req = arrayToObject($array);
print_r($req);
stdClass Object
(
[hello] => 1
[open2] => 2
[object] => stdClass Object
(
[obj] => inner
[inner3] => stdClass Object
(
[object3] => Inner
)
Теперь можно обращаться к свойствам объекта следующим образом:
Вот таким образом, можно конвертировать (одномерный/многомерный) массив в объект в PHP.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Преобразовать в PHP объекта в ассоциативный массив
я интегрирую API на свой сайт, который работает с данными, хранящимися в объектах, в то время как мой код написан с использованием массивов.
Мне нужна быстрая и грязная функция для преобразования объекта в массив.
27 ответов
просто typecast это
если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта. Ключи-это имена переменных-членов с несколькими заметными исключениями: целочисленные свойства недоступны; частные переменные имеют имя класса, добавленное к имени переменной; защищенные переменные имеют’*’, добавленное к имя переменной. Эти добавленные значения имеют нулевые байты с обеих сторон.
Пример: Простой Объект
Пример: Сложный Объект
вывод (с \ 0s отредактировано для ясности):
выход с var_export вместо var_dump :
Typecasting этот путь не будет делать глубоко приведение графа объекта и вам нужно применить нулевые байты (как описано в цитате вручную) для доступа к любым непубличным атрибутам. Таким образом, это лучше всего работает при кастинге объектов StdClass или объектов только с общедоступными свойствами. Для быстрого и грязного (то, что вы просили) это нормально.
вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, полагаясь на поведение функций кодирования/декодирования JSON:
С первого хита Google для»объект php для массива assoc» у нас есть это:
Если ваши свойства объекта являются общедоступными, вы можете сделать:
если они являются частными или защищенными, они будут иметь странные имена ключей в массиве. Итак, в этом случае вам понадобится следующая функция: