Преобразование объекта в массив в PHP упрощает доступ к данным из набора объектов. Большинство API выдают объект в качестве ответа.

Некоторые API могут возвращать сложную структуру объектов. Например, сочетание объектов и массивов в пакете с ответом. В этом случае процесс преобразования объекта в массив упростит разбор данных.

Этот быстрый пример выполняет преобразование объекта в массив в PHP за один шаг. Он создает набор объектов и устанавливает их свойства.

Для преобразования используется функция JSON encode() decode(). Функция json_decode() передает булево значение true для получения выходного массива.

<?php
$object = new StdClass();
$object->id = 5678;
$object->name = "William";
$object->department = "CSE";
$object->designation = "Engineer";

$result = json_encode($object);
// converts object $result to array
$output = json_decode($result, true);

print "<pre>";
print_r($result);
?>

После «декодирования» выходной массив выводится в браузер. На скриншоте ниже показан вывод этой программы.

Справка PHP

Из официальной документации:

json_decode — Декодирует строку JSON

json_decode(
    string $json,
    ?bool $associative = null,
    int $depth = 512,
    int $flags = 0
): mixed

Принимает закодированную в JSON строку и преобразует её в переменную PHP.

Примечание. Подробнее про параметры функции см. в документации PHP.

Различные способы преобразования объекта PHP в массив

При преобразовании объекта в массив пары свойств объекта ‘имя:значение’ образуют ассоциативный массив.

Если объект содержит неприсвоенные свойства, то будет возвращен массив с числовыми ключами.

Существует два способа преобразования объекта в массив в PHP.

  1. Приведение типа объекта к массиву.
  2. Кодирование и декодирование свойств объекта в массив элементов.

Приведение типов является простым методом преобразования типа входных данных. Второй метод применяет json_decode() к данному объекту. В качестве второго параметра он передает булево true для получения выходных данных в формате массива.

В этой статье приведены примеры использования обоих вышеуказанных методов для выполнения преобразования объекта в массив.

Преобразование объекта PHP в массив с помощью приведения типов

Это альтернативный метод преобразования типа объекта в массив. В приведенном ниже примере используется тот же входной объект.

Он заменяет преобразование JSON encode decode через оператор приведения типов. На выходе получится то же самое, что мы видели выше.

Синтаксис приведения типов в PHP показан ниже. Он добавляет целевой тип данных, заключенный в круглые скобки.

$output = (target-data-type) $input

В итоге:

<?php
$object = new StdClass();
$object->id = 5678;
$object->name = "William";
$object->department = "CSE";
$object->destination = "Engineer";

print"<pre>";
print_r( (array) $object );
?>

Рекурсивное преобразование объекта в массив

В этом примере используется входной объект с глубиной = 3. Он добавляет дополнительные свойства на вложенном уровне на разной глубине. Набор иерархических объектов устанавливается в качестве входных данных для процесса преобразования.

Эта программа определяет пользовательскую функцию для преобразования объекта PHP в массив. Она выполняет преобразование рекурсивно на каждом уровне входного объекта.

<?php
$object = new StdClass();
$object->id = 5678;
$object->name = "William";

$object->address = new stdClass();
$object->address->email = "William@gmail.com";

$object->address->billing = new stdClass();
$object->address->billing->zipcode = 9950;

$object->address->shipping = new stdClass();
$object->address->shipping->zipcode = 1234;

$object->address->state = "South Carolina";
$object->address->city = "Columbia";
$object->address->country = "US";

function objectToArray($object)
{
    foreach ($object as $k => $obj) {
        if (is_object($obj)) {
            $object->$k = objectToArray($obj);
        } else {
            $object->$k = $obj;
        }
    }
    return (array) $object;
}

$result = objectToArray($object);

print "<pre>";
print_r($result);
?>

Это вывод рекурсивного объекта PHP для программы преобразования массива, приведенной выше.

Преобразование объекта класса PHP в массив

В этом примере создается пакет объектов класса PHP. Конструктор класса устанавливает свойства объекта во время создания экземпляра.

Затем экземпляр класса Student кодируется для подготовки данных типа объекта. Функция json_encode() подготавливает объект JSON для предоставления его для декодирования, json_decode() преобразует объект PHP в массив.

<?php
class student
{
    public function __construct($id, $name, $state, $city, $country)
    {
        $this->id = $id;
        $this->name = $name;
        $this->state = $state;
        $this->city = $city;
        $this->country = $country;
    }
}

$student = new student("5678", "William", "South Carolina", "Columbia", "US");
$result = json_encode($student);
$output = json_decode($result, true);
print "<pre>";
print_r($output);
?>

Проверка is_object() перед преобразованием

Хорошей практикой программирования является проверка доступности данных перед обработкой. В этом примере применяется проверка is_object перед преобразованием объекта PHP в массив.

Этот метод проверяет, является ли входной файл объектом. PHP включает эксклюзивные функции для проверки наличия данных и их типов. Например, isset(), empty(), is_array() и т.д.

<?php

class student
{

    public function __construct($id, $name, $state, $city, $country)
    {
        $this->id = $id;
        $this->name = $name;
        $this->state = $state;
        $this->city = $city;
        $this->country = $country;
    }
}
$student= new student("5678", "William", "South Carolina", "Columbia", "US");

print "<pre>";
if (is_object($student)) {
    echo "Input Object:" . '<br>';
    $result = json_encode($student);
    print_r($result);
    $studentArray = json_decode($result, true);
}

if(!empty($studentArray) && is_array($studentArray)) {
    echo "<br><br>Output Array:" . '<br>';
    print_r($studentArray);
}
?>

Преобразование приватного, защищенного объекта класса

Приведенная ниже программа определяет класс с приватными и защищенными свойствами. PHP-код инстанцирует класс и создает связку объектов.

Справка. Инстанцирование (англ. instantiation) — создание экземпляра класса. В отличие от слова «создание», применяется не к объекту, а к классу.

Для преобразования объекта в массив она использует методы приведения типа и декодирования.

При использовании метода приведения типа индекс выходного массива частного свойства содержит префикс имени класса. После преобразования индекс массива имеет префикс * для protected свойств.

<?php
class Student
{
    public $name;
    private $id;
    protected $email;
    
    public function __construct()
    {
        $this->name ="William";
        $this->id = 5678;
        $this->email = "william@gmail.com";
    }
}

print "<pre>";
$student = new Student;
$result = json_encode($student);
$output1 = json_decode($result, true);
print "<br/>Using JSON decode:<br/>";
print_r($output1);

$output2 = new Student;
print "<br/><br/>Using Type casting:<br/>";
print_r( (array) $output2 );
?>

Этот скриншот вывода показывает разницу в индексе массива. Они создаются из приватных и защищенных свойств экземпляра класса.

Доступ к свойствам объекта с помощью числовых ключей

Эта программа включает ассоциативный массив данных о студентах. Она также содержит значения с числовыми ключами.

При преобразовании этого массива в объект ключи ассоциативного массива используются для доступа к значениям свойств объекта. Существуют исключения для доступа к свойствам, если у них нет имени.

В приведенном ниже коде показано, как получить доступ к объектам с числовыми ключами. Ключ заключен в фигурные скобки {} для получения значения.

<?php
$inputArray = array(
    'name' => 'William',
    'email' => 'William@gmail.com',
    'phone' => '12345678',
    'REG5678'
);

$student = (object) array(
    'name' => 'William',
    'email' => 'William@gmail.com',
    'phone' => '12345678',
    'REG5678'
);
echo '<pre>' . print_r($student, true) . '</pre>';
echo '<br />' . $student->name;
echo '<br />' . $student->email;
echo '<br />' . $student->phone;
echo '<br />' . $student->{0};
?>

Заключение

Мы рассмотрели различные способы преобразования объекта PHP в массив. Базовое приведение типов в PHP обеспечило преобразование объекта, за исключением нескольких особых случаев.

Процесс PHP JSON encode decode выполнил преобразование с помощью одной строки кода. Он принимает объекты класса и преобразует их свойства в список массивов.

Пользовательская функция выполняет рекурсивное преобразование объекта в массив. Она предназначена для обработки сложных объектов, дочерними элементами которых являются смешанные объекты или массивы.

Это перевод статьи Винци про преобразования объектов в массивы.

Статьи #