Приведение много-уровневого объекта(который может содержать как массивы так и другие объекты) в PHP к массиву

В качестве примера можно рассмотреть объект из следующего листинга.

Результат выполнения var_dump кода приведённого выше показан в следующем листинге.

Для преобразования объекта в массив есть как минимум два стандартных варианта, а именно явное применение переменной к массиву, следующим образом: (array)$obj и применение для этих же целей функции get_object_vars, при этом оба метода выполнят приведение объекта к массиву только непосредственно присвоенного переменной, объекты же находящиеся уровнями ниже в обоих случаях будут оставлены без изменения. Кроме того если первый способ будет применён к массиву а не к объекту, по в результате приведения будет возвращён массив соответствующий исходному(то-есть никаких изменений не произойдёт), если же передать массив функции get_object_var, в этом случаи вообще будет возвращён NULL. То есть применительно к переменной $ar из первого листинга, выполнение $ar = array($ar); присвоит переменной аналогичный массив, а выполнение get_object_var($ar) вернёт NULL.

Для того чтобы продемонстрировать, что оба способа преобразуют объект в массив при том что преобразованию подвергается именно объект применим оба способа к элементу массива $ar с ключом "y", который содержит объект. То есть выполним (array)$ar["y"]; и get_object_var($ar["y"]);. Результат выполнения как приведения с использованием (array), так и при использовании функции get_object_var будет одинаковым и var_dump результата приведён в следующем листинге.

Обратите внимание, что в полученном в результате приведения массиве элемент с ключом ar2 содержит объект, который не был преобразован к массиву, таким образом ещё раз укажу - что приведение двумя указанными выше способами осуществляется только для непосредственно переданного объекта(то есть для которого осуществляется приведение с использованием (array) или который передаётся функции get_object_var).

Существует способ приведения текущего объекта и всех вложенных объектов к массиву с использованием последовательных вызовов json_encode и json_decode, для этого последнему так же необходимо передать второй параметр равный true(а если требуется обратное преобразование массивов к объекту, то вторым параметром необходимо передать false, в этом случаи преобразование аналогично будет выполнено и для вложенных элементов). Применительно к переменной $ar которая содержит в себе массив, элементы которого в том числе содержат объект приведение можно выполнить кодом json_decode(json_encode($ar),true); результирующий var_dump приведённого кода показан в следующем листинге.

Как можно увидеть в приведённом выше var_dump результата выполнения приведения объектов(в том числе вложенных) к массиву с использованием последовательного выполнения json_encode и json_docode(с вторым параметром true) проведение вложенных объектов к массиву так же выполнено. Тем не менее этот метод может не сработать если элементы переменной(элементы массива или свойства объекта) содержат рекурсивные ссылки, в этом случаи выполнение json_encode завершится соответствующей ошибкой.

Так же в случаи необходимости приведения массивов к объекту в учётом вложенных переменных для случая с рассматриваемой переменной $ar можно воспользоваться следующим кодом: json_decode(json_encode($ar),false); таким образом второй параметр в функции json_decode как раз и указывает будет ли возвращён массив(в таком случаи второй параметр передаётся равный true) или объект(второй параметр не передаётся или передаётся равным false).

Комментарии

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

Имя:
E-mail:
Текст комментария:

Вы так же можете прочитать следующие статьи: