Как я могу преобразовать такой массив в объект?
[128] => Array
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => Array
(
[status] => The other day at work, I had some spare time
)
$a = (object)['hello' => 'world'];
Ответы:
В простейшем случае, вероятно, достаточно «привести» массив в качестве объекта:
Другой вариант - создать экземпляр стандартного класса в качестве переменной и выполнить цикл по массиву, переназначая значения:
Как отметил Эдсон Медина , действительно чистым решением является использование встроенных
json_
функций:Это также (рекурсивно) преобразует все ваши вложенные массивы в объекты, которые вы можете или не хотите. К сожалению, он имеет 2-3-кратное снижение производительности по сравнению с циклическим подходом.
Предупреждение! (спасибо Ultra за комментарий):
источник
x
в массиве содержит ссылку на другой массив. Тогда$object->x
после выполнения вашего однострочного будет дубликат$array['x']
, а не ссылка на исходный массив. Это может быть безвредно в некоторых приложениях, но для больших массивов это тратит впустую память и может испортить выполнение, если ссылка используется позже.Вы можете просто использовать приведение типов для преобразования массива в объект.
источник
Простой способ был бы
Но это не то, что вы хотите. Если вам нужны объекты, вы хотите чего-то достичь, но этого нет в этом вопросе. Использование объектов только по причине использования объектов не имеет смысла.
источник
Быстрый взлом:
Не красиво, но работает.
источник
$this
в комментариях, которые следуют в качестве средства доступа, подразумевается, что он / она желает получитьstdClass
экземпляр в качестве вывода, а не пользовательский класс, такой как ваш ответ. Я согласен с элегантностью этого решения, но, к сожалению, это довольно часто используемый шаблон для решения этой проблемы с вложенными массивами, где приведение к объекту не будет работать. Также возможно, что OP использует интерфейс, который требует и объект в качестве ввода, а не массив.Вот три способа:
Поддельный реальный объект:
Преобразуйте массив в объект, приведя его к объекту:
Вручную преобразовать массив в объект:
источник
Это простой способ, он также создаст объект для рекурсивных массивов:
источник
false
кjson_decode()
вернет ассоциативный массив.true
tojson_decode
возвращает ассоциативный массив,false
является значением по умолчанию и возвращаетStdClass
экземпляр.В зависимости от того, где вам это нужно и как получить доступ к объекту, существуют разные способы сделать это.
Например: просто введите его
Однако наиболее совместимым является использование служебного метода (еще не являющегося частью PHP), который реализует стандартное приведение PHP на основе строки, которая указывает тип (или игнорируя его, просто отменяя ссылку на значение):
Пример использования в вашем случае ( Online Demo ):
источник
Этот работал для меня
Применение :
возвращает:
как обычно, вы можете сделать это как:
источник
$obj = (object) $array;
не работает для многомерных массивов.Насколько я знаю, встроенного метода для этого не существует, но это так же просто, как простой цикл:
Вы можете объяснить это, если вам это нужно для рекурсивного построения объекта.
источник
Вы можете использовать функцию (объект) для преобразования вашего массива в объект.
Результатом будет объект, который содержит массивы:
источник
На самом деле, если вы хотите использовать это с многомерными массивами, вы захотите использовать некоторую рекурсию.
источник
Я бы определенно пошел с чистым путем, как это:
если вы отправите:
вы получите это:
Я нашел это более логичным, сравнивая приведенные выше ответы от Объектов, которые должны использоваться для цели, для которой они были созданы (инкапсулированные милые маленькие объекты).
Также использование get_object_vars гарантирует, что в манипулируемом объекте не будет создано никаких дополнительных атрибутов (вам не нужен автомобиль с фамилией, а также человек, ведущий себя на 4 колесах).
источник
Вы также можете использовать ArrayObject, например:
источник
Тот, который я использую (это член класса):
источник
Немного сложная, но легко расширяемая техника:
Предположим, у вас есть массив
Предположим, у вас есть класс Person, который может иметь больше или меньше атрибутов из этого массива. например
Если вы все еще хотите изменить свой массив на объект person. Вы можете использовать ArrayIterator Class.
Теперь у вас есть объект-итератор.
Создайте класс, расширяющий класс FilterIterator; где вы должны определить абстрактный метод принять. Следовать примеру
Вышеуказанная имплементация будет связывать свойство, только если оно существует в классе.
Добавьте еще один метод в классе PersonIterator
Убедитесь, что в вашем классе определены мутаторы. Теперь вы готовы вызывать эти функции там, где вы хотите создать объект.
источник
рекурсия твой друг
источник
Для этого требуется PHP7, потому что я решил использовать лямбда-функцию для блокировки 'innerfunc' внутри основной функции. Лямбда-функция вызывается рекурсивно, поэтому необходимо: «использовать (& $ innerfunc)». Вы можете сделать это в PHP5, но не можете скрыть innerfunc.
источник
используйте эту функцию, которую я сделал:
Применение:
источник
один лайнер
источник
x
в массиве содержит ссылку на другой массив. Тогда$object->x
после выполнения вашего однострочного будет дубликат$result_array['x']
, а не идентичный массив.Легко:
Пример:
Тогда верно следующее:
источник
Вы также можете сделать это, добавив (объект) слева от переменной, чтобы создать новый объект.
http://codepad.org/9YmD1KsU
источник
Использование
json_encode
проблематично из-за способа обработки данных не в формате UTF-8. Стоит отметить, что методjson_encode
/json_encode
также оставляет неассоциативные массивы в виде массивов. Это может или не может быть то, что вы хотите. Недавно я был вынужден воссоздать функциональность этого решения, но без использованияjson_
функций. Вот что я придумал:источник
Лучший метод в мире :)
если вы используете разные методы, у вас будут проблемы. Это лучший метод. Вы когда-либо видели.
источник
Многомерные массивы в объект. этот код используется для преобразования метода try и catch API поиска Bing.
источник
Вы можете использовать Reflection:
источник
CakePHP имеет рекурсивный класс Set :: map, который в основном отображает массив в объект. Возможно, вам придется изменить внешний вид массива, чтобы объект выглядел так, как вы этого хотите.
http://api.cakephp.org/view_source/set/#line-158
В худшем случае, вы можете получить несколько идей из этой функции.
источник
Очевидно, это просто экстраполяция ответов других людей, но вот рекурсивная функция, которая преобразует любой многомерный массив в объект:
И помните , что если массив имел цифровые клавиши , они все еще могут быть ссылки в полученном объекте с помощью
{}
(например:$obj->prop->{4}->prop
)источник
Вдохновленный всеми этими кодами, я попытался создать улучшенную версию с поддержкой: определенного имени класса, метода конструктора избегания, шаблона 'beans' и строгого режима (задайте только существующие свойства):
источник
Код
Эта функция работает так же, как и
json_decode(json_encode($arr), false)
.тестирование
Тест 1: Плоский массив
Вывод:
Тест 2: Массив объектов
Вывод:
Тест 3: Объект
Вывод:
источник
я сделал это довольно простым способом,
источник