преобразование объекта в массив php
Преобразовать в PHP объекта в ассоциативный массив
я интегрирую API на свой сайт, который работает с данными, хранящимися в объектах, в то время как мой код написан с использованием массивов.
Мне нужна быстрая и грязная функция для преобразования объекта в массив.
27 ответов
просто typecast это
если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта. Ключи-это имена переменных-членов с несколькими заметными исключениями: целочисленные свойства недоступны; частные переменные имеют имя класса, добавленное к имени переменной; защищенные переменные имеют’*’, добавленное к имя переменной. Эти добавленные значения имеют нулевые байты с обеих сторон.
Пример: Простой Объект
Пример: Сложный Объект
вывод (с \ 0s отредактировано для ясности):
выход с var_export вместо var_dump :
Typecasting этот путь не будет делать глубоко приведение графа объекта и вам нужно применить нулевые байты (как описано в цитате вручную) для доступа к любым непубличным атрибутам. Таким образом, это лучше всего работает при кастинге объектов StdClass или объектов только с общедоступными свойствами. Для быстрого и грязного (то, что вы просили) это нормально.
вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, полагаясь на поведение функций кодирования/декодирования JSON:
С первого хита Google для»объект php для массива assoc» у нас есть это:
Если ваши свойства объекта являются общедоступными, вы можете сделать:
если они являются частными или защищенными, они будут иметь странные имена ключей в массиве. Итак, в этом случае вам понадобится следующая функция:
php автоматическое преобразование объекта в массив
Я хочу преобразовать мой объект класса в массив. Я уже задавал вопрос о том, как преобразовать объект в массив.
Но при этом мне было интересно, можем ли мы сделать что-то вроде этого:
Как я знаю, он преобразует объект в массив, но если есть какая-то определенная пользователем функция, в которой я могу управлять этим поведением и позволить нескольким членам передаваться в качестве ключей массива.
Например, скажем, у меня есть класс:
Выход:
Но я не хочу этот вывод, я хочу изменить этот вывод и хочу вывод, как это:
Таким образом, должен быть какой-то способ, которым я мог бы вызывать пользовательскую функцию, когда кто-то пытался type cast мои объекты класса, как это:
Когда кто-то использует следующее утверждение:
Если кто-нибудь знает какие-либо способы сделать что-то подобное, пожалуйста, помогите мне.
Если есть какие-либо другие решения, которые могут привести к тому же результату, было бы очень полезно.
Решение
Объекты поддерживают реализацию ArrayAccess интерфейс, который обрабатывает их как массивы другими способами, но не предоставляет метод для полного приведения.
Есть несколько доступных решений:
get_object_vars
Как уже упоминалось, публичные свойства могут быть преобразованы только с помощью get_object_vars метод, например
JsonSerializable
Интерфейс JsonSerializable позволяет применять пользовательскую логику к тому, что происходит, когда json_encode называется, что дает улучшение в том смысле, что позволяет включать частные или защищенные свойства или любую другую пользовательскую логику, которая у вас есть.
json_decode а также json_encode вызовы в вышеупомянутом могут, конечно, быть обернуты в некоторый простой синтаксический сахар, такой как
Однако все это не позволяет вам переопределить то, что происходит, когда вы используете само приведение массива. Надеемся, что однажды одно из предложений будет принято, но до тех пор это будут лучшие варианты.
Другие решения
использование json_decode() а также json_encode() преобразовать объект php в массив
Как преобразовать объект в массив?
Как преобразовать этот объект в массив? Я хотел бы вывести следующее:
Будьте осторожны: для примитивных типов данных, таких как строки, он будет работать отлично, но я не знаю, как он ведет себя с вложенными объектами.
в вашем случае вам нужно что-то сделать;
Одномерные массивы
Многомерные массивы
Несколько грязным методом является использование собственных функций JSON PHP> = 5.2 для кодирования JSON и последующего декодирования обратно в массив. Однако это не будет включать частных и защищенных членов.
В качестве альтернативы, следующая функция будет конвертировать из объекта в массив, включая частные и защищенные члены, взятые отсюда и измененные для использования кастинга:
делает мелкое преобразование ($ object-> innerObject = new stdClass () остается объектом) и конвертирует назад и вперед, используя json works, но это не очень хорошая идея, если производительность является проблемой.
Если вам нужны все объекты, которые нужно преобразовать в ассоциативные массивы, вот лучший способ сделать это (код изрывается из того, что я не помню где):
Вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, опираясь на поведение функций кодирования / декодирования JSON:
Простая версия:
Обновленная рекурсивная версия:
Я попробовал несколько способов сделать foreach с объектом, и это действительно самый простой и крутой обходной путь, который я видел. Всего одна строка 🙂
Вы также можете использовать метод array_values () php
Я столкнулся с проблемой с ответом Энди Эрншоу, потому что я включил эту функцию в отдельный класс в моем приложении «HelperFunctions», что означало, что рекурсивный вызов objectToArray () не удался.
Я преодолел это, указав имя класса в вызове array_map следующим образом:
Я бы написал это в комментариях, но пока у меня недостаточно репутации.
Как преобразовать объект в массив?
Как преобразовать этот объект в массив? Я хотел бы вывести следующее:
Будьте осторожны: для примитивных типов данных, таких как строки, он будет работать отлично, но я не знаю, как он ведет себя с вложенными объектами.
в вашем случае вам нужно что-то сделать;
Одномерные массивы
Многомерные массивы
Несколько грязным методом является использование собственных функций JSON PHP> = 5.2 для кодирования JSON и последующего декодирования обратно в массив. Однако это не будет включать частных и защищенных членов.
В качестве альтернативы, следующая функция будет конвертировать из объекта в массив, включая частные и защищенные члены, взятые отсюда и измененные для использования кастинга:
делает мелкое преобразование ($ object-> innerObject = new stdClass () остается объектом) и конвертирует назад и вперед, используя json works, но это не очень хорошая идея, если производительность является проблемой.
Если вам нужны все объекты, которые нужно преобразовать в ассоциативные массивы, вот лучший способ сделать это (код изрывается из того, что я не помню где):
Вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, опираясь на поведение функций кодирования / декодирования JSON:
Простая версия:
Обновленная рекурсивная версия:
Я попробовал несколько способов сделать foreach с объектом, и это действительно самый простой и крутой обходной путь, который я видел. Всего одна строка 🙂
Вы также можете использовать метод array_values () php
Я столкнулся с проблемой с ответом Энди Эрншоу, потому что я включил эту функцию в отдельный класс в моем приложении «HelperFunctions», что означало, что рекурсивный вызов objectToArray () не удался.
Я преодолел это, указав имя класса в вызове array_map следующим образом:
Я бы написал это в комментариях, но пока у меня недостаточно репутации.
Массивы
Объяснение этих структур данных выходит за рамки данного справочного руководства, но вы найдете как минимум один пример по каждой из них. За дополнительной информацией вы можете обратиться к соответствующей литературе по этой обширной теме.
Синтаксис
Определение при помощи array()
Запятая после последнего элемента массива необязательна и может быть опущена. Обычно это делается для однострочных массивов, т.е. array(1, 2) предпочтительней array(1, 2, ). Для многострочных массивов с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять новые элементы в конец массива.
Начиная с PHP 5.4 возможно использовать короткий синтаксис определения массивов, который заменяет языковую конструкцию array() на [].
Пример #1 Простой массив
Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
Пример #2 Пример преобразования типов и перезаписи элементов
Результат выполнения данного примера:
Так как все ключи в вышеприведенном примере преобразуются к 1, значение будет перезаписано на каждый новый элемент и останется только последнее присвоенное значение «d».
Массивы в PHP могут содержать ключи типов integer и string одновременно, так как PHP не делает различия между индексированными и ассоциативными массивами.
Пример #3 Смешанные ключи типов integer и string
Результат выполнения данного примера:
Пример #4 Индексированные массивы без ключа
Результат выполнения данного примера:
Возможно указать ключ только для некоторых элементов и пропустить для других:
Пример #5 Ключи для некоторых элементов
Результат выполнения данного примера:
Как вы видите последнее значение «d» было присвоено ключу 7. Это произошло потому, что самое большое значение ключа целого типа перед этим было 6.
Доступ к элементам массива с помощью квадратных скобок
Доступ к элементам массива может быть осуществлен с помощью синтаксиса arrayпреобразование объекта в массив php.
Пример #6 Доступ к элементам массива
Результат выполнения данного примера:
Для доступа к элементам массива могут использоваться как квадратные, так и фигурные скобки (например, $array[42] и $array означают одно и то же в вышеприведенном примере).
С PHP 5.4 стало возможным прямое разыменование массива, возвращаемого в качестве результата вызова функции или метода. Раньше приходилось использовать временные переменные.
С PHP 5.5 стало возможным прямое разыменование элементов у литерала массива.
Пример #7 Разыменование массива
// в PHP 5.4
$secondElement = getArray ()[ 1 ];
Создание/модификация с помощью синтаксиса квадратных скобок
Существующий массив может быть изменен явной установкой значений в нем.
Это выполняется присвоением значений массиву array с указанием в скобках ключа. Кроме того, вы можете опустить ключ. В этом случае добавьте к имени переменной пустую пару скобок ([]).
$arr [ «x» ] = 42 ; // Это добавляет к массиву новый
// элемент с ключом «x»
Как уже говорилось выше, если ключ не был указан, то будет взят максимальный из существующих целочисленных ( integer ) индексов, и новым ключом будет это максимальное значение (в крайнем случае 0) плюс 1. Если целочисленных индексов еще нет, то ключом будет 0 (ноль).
Учтите, что максимальное целое значение ключа не обязательно существует в массиве в данный момент. Оно могло просто существовать в массиве какое-то время, с тех пор как он был переиндексирован в последний раз. Следующий пример это иллюстрирует:
Результат выполнения данного примера:
Полезные функции
Для работы с массивами существует достаточное количество полезных функций. Смотрите раздел функции для работы с массивами.
Управляющая конструкция foreach существует специально для массивов. Она предоставляет возможность легко пройтись по массиву.
Что можно и нельзя делать с массивами
Почему $foo[bar] неверно?
Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива. К примеру, пишите $foo[‘bar’], а не $foo[bar]. Но почему? Часто в старых скриптах можно встретить следующий синтаксис:
Замечание: Это не означает, что нужно всегда заключать ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные, поскольку это помешает PHP обрабатывать их.
Результат выполнения данного примера:
Дополнительные примеры, демонстрирующие этот факт:
// Показываем все ошибки
error_reporting ( E_ALL );
Если вы переведете error_reporting в режим отображения ошибок уровня E_NOTICE (например, такой как E_ALL ), вы сразу увидите эти ошибки. По умолчанию error_reporting установлена их не отображать.
Как указано в разделе синтаксис, внутри квадратных скобок (‘[‘ и ‘]‘) должно быть выражение. Это означает, что можно писать вот так:
Это пример использования возвращаемого функцией значения в качестве индекса массива. PHP известны также и константы:
поскольку E_ERROR соответствует 1, и т.д.
Так что же в этом плохого?
Когда-нибудь в будущем, команда разработчиков PHP, возможно, пожелает добавить еще одну константу или ключевое слово, либо константа из другого кода может вмешаться и тогда у вас могут возникнуть проблемы. Например, вы уже не можете использовать таким образом слова empty и default, поскольку они являются зарезервированными ключевыми словами.
Преобразование в массив
Если вы преобразуете в массив объект ( object ), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: целочисленные свойства станут недоступны; к закрытым полям класса (private) спереди будет дописано имя класса; к защищенным полям класса (protected) спереди будет добавлен символ ‘*’. Эти добавленные значения с обоих сторон также имеют нулевые байты. Это может вызвать несколько неожиданное поведение:
var_dump ((array) new B ());
?>
Вышеприведенный код покажет 2 ключа с именем ‘AA’, хотя один из них на самом деле имеет имя ‘\0A\0A’.
Сравнение
Массивы можно сравнивать при помощи функции array_diff() и операторов массивов.
Примеры
The array type in PHP is very versatile. Here are some examples: Тип массив в PHP является очень гибким, вот несколько примеров:
Пример #8 Использование array()
// пустой массив
$empty = array();
?>
Пример #9 Коллекция
Результат выполнения данного примера:
Изменение значений массива напрямую стало возможным с версии PHP 5 путем передачи их по ссылке. До этого необходим следующий обходной прием:
Пример #10 Изменение элемента в цикле
Результат выполнения данного примера:
Следующий пример создает массив, начинающийся с единицы.
Пример #11 Индекс, начинающийся с единицы
Результат выполнения данного примера:
Пример #12 Заполнение массива
Пример #13 Сортировка массива
Поскольку значение массива может быть чем угодно, им также может быть другой массив. Таким образом вы можете создавать рекурсивные и многомерные массивы.
Пример #14 Рекурсивные и многомерные массивы
// Создаст новый многомерный массив
$juices [ «apple» ][ «green» ] = «good» ;
?>
Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы скопировать массив по ссылке, вам нужно использовать оператор ссылки.