Как преобразовать объект в массив?
<?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
Вы должны посмотреть get_object_vars, так как ваши свойства объявлены частными, вы должны вызвать это внутри класса и вернуть его результаты.
Будьте осторожны: для примитивных типов данных, таких как строки, он будет работать отлично, но я не знаю, как он ведет себя с вложенными объектами.
в вашем случае вы должны сделать что-то вроде:
<?php
print_r(get_object_vars($response->response->docs));
?>
Ответ 2
Одномерные массивы
Для преобразования одномерных массивов вы можете использовать с помощью (array)
или get_object_vars
, которые Бенуа упомянул в
его ответ.
// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);
Они немного отличаются друг от друга. Например, get_object_vars
возвращает массив с только общедоступными свойствами, если он не вызван из области объекта, который вы передаете (т.е. В функции-члена объекта). (array)
, с другой стороны, будет передан массиву со всеми публичными, частными и защищенными членами, неповрежденными в массиве, хотя, конечно, все публично.
Многомерные массивы
Несколько грязный метод заключается в том, чтобы использовать PHP >= 5.2 собственные функции JSON для кодирования JSON, а затем декодировать обратно в массив. Однако это не будет включать закрытых и защищенных членов.
// The second parameter of json_decode forces parsing into an associative array
$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);
}
Ответ 3
Осторожно:
$array = (array) $object;
делает мелкое преобразование ($ object- > innerObject = new stdClass() остается объектом) и конвертирует назад и вперед, используя json works, но это не очень хорошая идея, если производительность является проблемой.
Если вам нужно, чтобы все объекты, которые нужно преобразовать в ассоциативные массивы, здесь лучший способ сделать это (код, из которого я не помню, где):
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
Вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, опираясь на поведение функций кодирования/декодирования JSON:
$array = json_decode(json_encode($response->response->docs), true);
Ответ 5
Простая версия:
$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();
Ответ 6
$array = json_decode(json_encode($object), true);
Я попробовал несколько способов сделать foreach
с объектом, и ЭТО действительно самое легкое и крутое обходное решение, которое я видел. Только одна строка:)
Ответ 7
Попробуйте следующее: -
<?php
print_r(json_decode(json_encode($response->response->docs),true));
?>
Ответ 8
У меня была та же проблема, и я решил ее с помощью get_object_vars, упомянутого выше.
Кроме того, мне пришлось преобразовать свой объект с json_decode, и мне пришлось перебирать массив с помощью oldschool для цикла (а не для каждого).
Ответ 9
Вы также можете использовать метод array_values () php
Ответ 10
Я столкнулся с проблемой с ответом Энди Эрншоу, потому что я включил эту функцию в отдельный класс в моем приложении "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);
}
Я бы написал это в комментариях, но пока у меня недостаточно репутации.
Ответ 11
//My Function is worked. Hope help full for you :)
$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);
}
}
}