可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
<?php
print_r($response->response->docs);
?>
Outputs the following:
Array
(
[0] => Object
(
[_fields:private] => Array
(
[id]=>9093
[name]=>zahir
)
Object
(
[_fields:private] => Array
(
[id]=>9094
[name]=>hussain
)..
)
)
How can I convert this object to an array? I\'d like to output the following:
Array
(
[0]=>
(
[id]=>9093
[name]=>zahir
)
[1]=>
(
[id]=>9094
[name]=>hussain
)...
)
Is this possible?
回答1:
You should look at get_object_vars , as your properties are declared private you should call this inside the class and return its results.
Be careful, for primitive data types like strings it will work great, but I don\'t know how it behaves with nested objects.
in your case you have to do something like;
<?php
print_r(get_object_vars($response->response->docs));
?>
回答2:
Single-dimensional arrays
For converting single-dimension arrays, you can cast using (array)
or there\'s get_object_vars
, which Benoit mentioned in
his answer.
// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);
They work slightly different from each other. For example, get_object_vars
will return an array with only publicly accessible properties unless it is called from within the scope of the object you\'re passing (ie in a member function of the object). (array)
, on the other hand, will cast to an array with all public, private and protected members intact on the array, though all public now, of course.
Multi-dimensional arrays
A somewhat dirty method is to use PHP >= 5.2\'s native JSON functions to encode to JSON and then decode back to an array. This will not include private and protected members, however, and is not suitable for objects that contain data that cannot be JSON encoded (such as binary data).
// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);
Alternatively, the following function will convert from an object to an array including private and protected members, taken from here and modified to use casting:
function objectToArray ($object) {
if(!is_object($object) && !is_array($object))
return $object;
return array_map(\'objectToArray\', (array) $object);
}
回答3:
You can quickly convert deeply nested objects to associative arrays by relying on the behavior of the JSON encode/decode functions:
$array = json_decode(json_encode($response->response->docs), true);
回答4:
Careful:
$array = (array) $object;
does a shallow conversion ($object->innerObject = new stdClass() remains an object) and converting back and forth using json works but it\'s not a good idea if performance is an issue.
If you need all objects to be converted to associative arrays here is a better way to do that (code ripped from I don\'t remember where):
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;
}
回答5:
$array = json_decode(json_encode($object), true);
I tried several ways to do a foreach
with an object and THIS really is the most easy and cool workaround I have seen. Just one line :)
回答6:
Simple version:
$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();
Updated recursive version:
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();
回答7:
Try this:-
<?php
print_r(json_decode(json_encode($response->response->docs),true));
?>
回答8:
I had the same problem and I solved it with get_object_vars mentioned above.
Furthermore, I had to convert my object with json_decode and I had to iterate the array with the oldschool \"for\" loop (rather then for-each).
回答9:
You can also use array_values() method of php
回答10:
I ran into an issue with Andy Earnshaw\'s answer because I had factored this function out to a separate class within my application, \"HelperFunctions\", which meant the recursive call to objectToArray() failed.
I overcame this by specifying the class name within the array_map call like so:
public function objectToArray($object) {
if (!is_object($object) && !is_array($object))
return $object;
return array_map(array(\"HelperFunctions\", \"objectToArray\"), (array) $object);
}
I would have written this in the comments but I don\'t have enough reputation yet.
回答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);
}
}
}