php перевести массив в объект php
Преобразовать в PHP объекта в ассоциативный массив
я интегрирую API на свой сайт, который работает с данными, хранящимися в объектах, в то время как мой код написан с использованием массивов.
Мне нужна быстрая и грязная функция для преобразования объекта в массив.
27 ответов
просто typecast это
если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта. Ключи-это имена переменных-членов с несколькими заметными исключениями: целочисленные свойства недоступны; частные переменные имеют имя класса, добавленное к имени переменной; защищенные переменные имеют’*’, добавленное к имя переменной. Эти добавленные значения имеют нулевые байты с обеих сторон.
Пример: Простой Объект
Пример: Сложный Объект
вывод (с \ 0s отредактировано для ясности):
выход с var_export вместо var_dump :
Typecasting этот путь не будет делать глубоко приведение графа объекта и вам нужно применить нулевые байты (как описано в цитате вручную) для доступа к любым непубличным атрибутам. Таким образом, это лучше всего работает при кастинге объектов StdClass или объектов только с общедоступными свойствами. Для быстрого и грязного (то, что вы просили) это нормально.
вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, полагаясь на поведение функций кодирования/декодирования JSON:
С первого хита Google для»объект php для массива assoc» у нас есть это:
Если ваши свойства объекта являются общедоступными, вы можете сделать:
если они являются частными или защищенными, они будут иметь странные имена ключей в массиве. Итак, в этом случае вам понадобится следующая функция:
Как преобразовать массив в объект в PHP?
Как я могу преобразовать массив, подобный этому, в объект?
В простейшем случае, вероятно, достаточно «отличить» массив как объект:
Другим вариантом было бы создание стандартного класса в качестве переменной и цикл через массив при повторном присвоении значений:
Это также (рекурсивно) преобразует все ваши вспомогательные массивы в объекты, которые вы можете или не захотите. К сожалению, он имеет производительность в 2-3 раза по сравнению с циклом.
Предупреждение! (спасибо Ultra за комментарий):
json_decode в разных средах преобразует данные UTF-8 по-разному. В итоге я получаю локальные значения «240,00» и «240» на производстве – массивный диссипатор. Morover, если преобразование завершено, строка get возвращается как NULL
вы можете просто использовать кастинг типов для преобразования массива в объект.
Подделка реального объекта:
Преобразуйте массив в объект, наведя его на объект:
Вручную преобразуйте массив в объект:
Не красиво, но работает.
Легким способом было бы
Но это не то, что вы хотите. Если вы хотите объекты, которые хотите чего-то достичь, но этого не хватает в этом вопросе. Использование объектов только по причине использования объектов не имеет смысла.
В зависимости от того, где вам это нужно и как получить доступ к объекту, есть разные способы сделать это.
Например: просто придумайте это
Тем не менее, наиболее совместимым является использование метода утилиты (еще не части PHP), который реализует стандартное кастинг PHP на основе строки, которая указывает тип (или игнорируя его просто де-ссылку на значение):
Пример использования в вашем случае ( онлайн-демонстрация ):
Его путь к простому. Это также создаст объект для рекурсивных массивов:
Это работало для меня
Применение :
возвращает:
как обычно, вы можете зацикливать его так:
Нет никакого встроенного метода, чтобы это сделать, насколько я знаю, но это так же просто, как простой цикл:
Вы можете изложить это, если вам это нужно, чтобы рекурсивно строить ваш объект.
На самом деле, если вы хотите использовать это с многомерными массивами, вы хотели бы использовать некоторую рекурсию.
Я бы определенно пошел с таким чистым способом:
вы получите следующее:
Я нашел, что это более логичное сравнение вышеупомянутых ответов от Объектов должно использоваться для цели, для которой они были сделаны (инкапсулированные милые маленькие объекты).
Также использование get_object_vars гарантирует, что в управляемом объекте не создаются дополнительные атрибуты (вы не хотите, чтобы автомобиль имел фамилию, а также человек, ведущий 4 колеса).
рекурсия – ваш друг:
Тогда справедливо следующее:
Вы также можете использовать ArrayObject, например:
используйте эту функцию, которую я сделал:
Вы также можете сделать это, добавив (объект) слева от переменной для создания нового объекта.
Использование json_encode проблематично из-за того, что он обрабатывает данные, отличные от UTF-8. Стоит отметить, что метод json_encode / json_encode также оставляет неассоциативные массивы в виде массивов. Это может быть или не быть тем, что вы хотите. Недавно мне было необходимо обновить функциональность этого решения, но без использования json_ функций. Вот что я придумал:
Лучший метод в МИРЕ 🙂
если вы используете разные методы, у вас будут проблемы. Это лучший метод. Вы когда-либо видели.
Вдохновленный всеми этими кодами, я попытался создать расширенную версию с поддержкой: определенного имени класса, избежать метода конструктора, шаблона beans и строгого режима (установить только существующие свойства):
тестирование
Тест 1: Плоский массив
Тест 2: Массив объектов
Тест 3: Объект
Небольшая сложная, но простая в использовании техника:
Предположим, у вас есть массив
Предположим, у вас есть класс человека, который может иметь больше или меньше атрибутов из этого массива. например
Если вы все еще хотите изменить свой массив на объект person. Вы можете использовать класс ArrayIterator.
Теперь у вас есть объект итератора.
Создайте класс, расширяющий класс FilterIterator; где вы должны определить прием абстрактного метода. Следовать примеру
Вышеупомянутое империрование свяжет свойство только в том случае, если оно существует в классе.
Добавьте еще один метод в класс PersonIterator
Убедитесь, что в вашем классе определены мутаторы. Теперь вы можете вызвать эту функцию, где хотите создать объект.
CakePHP имеет рекурсивный класс Set :: map, который в основном отображает массив в объект. Возможно, вам придется изменить то, как выглядит массив, чтобы объект выглядел так, как вы хотите.
В худшем случае вы можете получить несколько идей от этой функции.
Очевидно, что это просто экстраполяция ответов некоторых других людей, но вот рекурсивная функция, которая преобразует любой мульш-мерный массив в объект:
я сделал это довольно простым способом,
Используя (массив) и (объект) в качестве префикса, вы можете просто преобразовать массив объектов в стандартный массив и наоборот
Я использую следующее для разбора ассоциативных массивов файлов Ямл в состояние объекта.
Это проверяет все предоставленные массивы, если есть объекты, скрывающиеся там, и превращает их также в объекты.
Это превращает ямль, сконфигурированный как
к массиву, состоящему из:
Конвертирование массива в объект в 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. Как скопировать массив в PHP
В этой статье поговорим, как преобразовать массив в объект и как создать ссылку на массив и скопировать его. Начнём с преобразования — здесь нам поможет приведение массива к типу object. Как только мы выполним преобразование массива в тип object, произойдёт создание нового экземпляра встроенного в PHP класса stdClass.
1. Преобразование массива
Итак, представьте, что у нас есть ассоциативный массив, и мы желаем преобразовать его в объект.
Теперь посмотрим на stdClass
Обращаемся к членам объекта в PHP
После выполнения преобразования ряд элементов нашего объекта (бывшего массива) мы можем получить как член класса, если они отвечают правилам именования переменной (тут следует понимать, что правильное имя должно начинаться с буквы либо символа подчеркивания, а также состоять из цифр, букв и символов подчеркивания в любом количестве).
Переменное имя свойства
Если ключ нашего элемента содержал другие символы (допустим, дефис), получить значение мы сможем лишь при помощи переменного имени свойства.
Числовые ключи
Если же ключ был числовым, получить значение из объекта в PHP мы можем лишь при помощи итераций foreach :
2. Создание ссылки и копирование массива
Теперь перейдём ко второй части нашей статьи. На самом деле, скопировать массив в PHP несложно:
Смотрим результат:
Что касается создания ссылки на массив в PHP, то нам надо всего лишь добавить амперсант:
На этом всё, приобрести более глубокие навыки PHP-программирования вы сможете на наших курсах:
Как преобразовать массив в объект в PHP?
Как я могу преобразовать такой массив в объект?
30 ответов:
в простейшем случае, вероятно, достаточно «бросить» массив в качестве объекта:
как Эдсон Медина указал, действительно чистое решение заключается в использовании встроенного json_ функции:
Это также (рекурсивно) преобразует все ваши суб массивы в объекты, которые вы можете или может не хочу. К сожалению, он имеет 2-3x производительность над циклическим подходом.
предупреждение! (спасибо Ultra за комментарий):
вы можете просто использовать приведение типов для преобразования массива в объект.
подделка реального объекта:
преобразуйте массив в объект, приведя его к объекту:
вручную преобразовать массив в объект:
не очень красиво, но работает.
но это не то, что вы хотите. Если вам нужны объекты, вы хотите чего-то достичь, но этого не хватает в этом вопросе. Использование объектов только по причине использования объектов не имеет смысла.
его путь к простому, это создаст объект для рекурсивных массивов, а также:
В зависимости от того, где вам это нужно и как получить доступ к объекту есть разные способы сделать это.
например: просто наберите его
однако наиболее совместимым является использование служебного метода (еще не являющегося частью PHP), который реализует стандартное PHP-кастинг на основе строки, указывающей тип (или игнорируя его, просто снимая ссылку на значение):
пример использования в вашем случае (онлайн Демо):
использование :
возвращает :
как обычно, вы можете зациклить его так:
там нет встроенного метода, чтобы сделать это, насколько я знаю, но это так же просто, как простой цикл:
вы можете изложить это, если вам нужно построить свой объект рекурсивно.
на самом деле, если вы хотите использовать это с многомерными массивами, вы хотели бы использовать некоторую рекурсию.
Я бы определенно пошел с чистым способом, как это:
Если вы представите:
Я нашел это более логичным, сравнивая приведенные выше ответы от объектов, которые должны использоваться для той цели, для которой они были сделаны (инкапсулированные милые маленькие объекты).
также с помощью get_object_vars убедитесь, что никакие дополнительные атрибуты не создаются в управляемом объекте (вы не хотите автомобиль, имеющий фамилию, ни человек, ведущий себя 4 колеса).