У меня есть следующий код:
<?php
print_r($response->response->docs);
?>
Он выводит следующее:
Array (
[0] => Object (
[_fields:private] => Array (
[id]=>9093
[name]=>zahir
)
Object (
[_fields:private] => Array (
[id]=>9094
[name]=>hussain
)..
)
)
Как я могу преобразовать этот объект в массив? Я хочу получить следующее:
Array (
[0]=> (
[id]=>9093
[name]=>zahir
)
[1]=> (
[id]=>9094
[name]=>hussain
)...
)
Это возможно?
Ответ 1
Одномерные массивы
Для преобразования одномерных массивов вы можете приводить их с помощью (array) или использовать get_object_vars.
// преобразование к массиву
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);
Они работают немного по-разному. Например, get_object_vars вернет массив только с общедоступными свойствами, если он не будет вызван из области видимости передаваемого объекта (т. е. в функции-члене объекта),array же, с другой стороны, приведет к массиву со всеми публичными, приватными и защищенными членами, хотя теперь все они, конечно, станут публичными.
Многомерные массивы
Несколько неправильным методом является использование встроенных функций JSON в PHP >= 5.2 для кодирования в JSON и последующего декодирования обратно в массив. Однако этот метод не включает приватные и защищенные члены и не подходит для объектов, содержащих данные, которые не могут быть закодированы в JSON (например, двоичные данные).
// Второй параметр json_decode заставляет выполнять разбор в ассоциативный массив
$array = json_decode(json_encode($object), true);
В качестве альтернативы, следующая функция, взятая из примера выше и модифицированная для использования кастинга, преобразует объект в массив, включающий приватные и защищенные члены:
function objectToArray ($object) {
if(!is_object($object) && !is_array($object))
return $object;
return array_map('objectToArray', (array) $object);
}
Ответ 2
Вы должны посмотреть на get_object_vars, так как ваши свойства объявлены приватными, вы должны вызвать его внутри класса и вернуть результаты. Будьте осторожны, для примитивных типов данных, таких как строки, он будет работать отлично, но я не уверен, как он поведет себя с вложенными объектами. В вашем случае вы должны сделать что-то вроде этого:
<?php
print_r(get_object_vars($response->response->docs));
?>
Ответ 3
Пример:
$array = (array) $object;
Делает неглубокое преобразование ($object->innerObject = new stdClass() и остается объектом) и конвертация туда и обратно с использованием json работает, но это не лучшая идея, если производительность является критичной. Если вам нужно, чтобы все объекты были преобразованы в ассоциативные массивы, вот лучший способ сделать это:
function toArray($obj) {
if (is_object($obj)) $obj = (array)$obj;
if (is_array($obj)) {
$new = array();
foreach ($obj as $key => $val) {
$new[$key] = toArray($val);
}
} else {
$new = $obj;
}
return $new;
}
Ответ 4
Простой пример:
$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();
Рекурсивная версия:
class RecursiveArrayObject extends ArrayObject {
function getArrayCopy() {
$resultArray = parent::getArrayCopy();
foreach($resultArray as $key => $val) {
if (!is_object($val)) {
continue;
}
$o = new RecursiveArrayObject($val);
$resultArray[$key] = $o->getArrayCopy();
}
return $resultArray;
}
}
$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();
Ответ 5
Я столкнулся с проблемой, связанной с предыдущим ответом, потому что я выделил эту функцию в отдельный класс в своем приложении, "HelperFunctions", что означало, что рекурсивный вызов objectToArray() не работает. Я решил эту проблему, указав имя класса в вызове array_map следующим образом:
public function objectToArray($object) {
if (!is_object($object) && !is_array($object))
return $object;
return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}
Ответ 6
// Моя функция работает. Надеюсь, это поможет вам :)
$input = [
'1' => (object) [1,2,3],
'2' => (object) [4,5,6,
(object) [6,7,8,
[9, 10, 11,
(object) [12, 13, 14]]]
],
'3' =>[15, 16, (object)[17, 18]]
];
echo "<pre>";
var_dump($input);
var_dump(toAnArray($input));
public function toAnArray(&$input) {
if (is_object($input)) {
$input = get_object_vars($input);
}
foreach ($input as &$item) {
if (is_object($item) || is_array($item)) {
if (is_object($item)) {
$item = get_object_vars($item);
}
self::toAnArray($item);
}
}
}
Web