Intereting Posts

Как преобразовать объект в массив?

<?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 )... ) 

Это возможно?

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

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

в вашем случае вам нужно что-то сделать;

 <?php print_r(get_object_vars($response->response->docs)); ?> 

Одномерные массивы

Для преобразования одноразмерных массивов вы можете использовать get_object_vars (array) или get_object_vars , о котором упомянул Бенуа в своем ответе .

 // Cast to an array $array = (array) $object; 
 // get_object_vars $array = get_object_vars($object); 

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

Многомерные массивы

Несколько грязным методом является использование собственных функций JSON PHP> = 5.2 для кодирования 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); } 

Осторожный:

 $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; } 

Вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, опираясь на поведение функций кодирования / декодирования JSON:

 $array = json_decode(json_encode($response->response->docs), true); 

Простая версия:

 $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(); 
 $array = json_decode(json_encode($object), true); 

Я попробовал несколько способов сделать foreach с объектом, и это действительно самый простой и крутой обходной путь, который я видел. Всего одна строка 🙂

Попробуй это:-

  <?php print_r(json_decode(json_encode($response->response->docs),true)); ?> 

Вы также можете использовать метод array_values ​​() php

Я столкнулся с проблемой с ответом Энди Эрншоу, потому что я включил эту функцию в отдельный класс в моем приложении «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); } 

Я бы написал это в комментариях, но пока у меня недостаточно репутации.

 //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); } } }