Здесь я создал метод objectToArray () , который также работает с рекурсивными объектами, например, когда $objectA
содержит $objectB
, что снова указывает на $objectA
.
Кроме того, я ограничил вывод открытыми свойствами, используя ReflectionClass.Избавьтесь от этого, если вам это не нужно.
/**
* Converts given object to array, recursively.
* Just outputs public properties.
*
* @param object|array $object
* @return array|string
*/
protected function objectToArray($object) {
if (in_array($object, $this->usedObjects, TRUE)) {
return '**recursive**';
}
if (is_array($object) || is_object($object)) {
if (is_object($object)) {
$this->usedObjects[] = $object;
}
$result = array();
$reflectorClass = new \ReflectionClass(get_class($this));
foreach ($object as $key => $value) {
if ($reflectorClass->hasProperty($key) && $reflectorClass->getProperty($key)->isPublic()) {
$result[$key] = $this->objectToArray($value);
}
}
return $result;
}
return $object;
}
Для идентификации уже используемых объектов я использую защищенное свойство в этом (абстрактном) классе с именем $this->usedObjects
.Если найден рекурсивный вложенный объект, он будет заменен строкой **recursive**
.В противном случае произойдет сбой из-за бесконечного цикла.