可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a problem to convert an object stdClass to array. I have tried in this way:
return (array) $booking;
or
return (array) json_decode($booking,true);
or
return (array) json_decode($booking);
The array before the cast is full with one record, after my try to cast it is empty. How to cast / convert it without delete its rows?
array before cast:
array(1) { [0]=> object(stdClass)#23 (36) { ["id"]=> string(1) "2" ["name"]=> string(0) "" ["code"]=> string(5) "56/13" } }
after cast is empty NULL if I try to make a var_dump($booking);
I have also tried this function but always empty:
public function objectToArray($d) { if (is_object($d)) { // Gets the properties of the given object // with get_object_vars function $d = get_object_vars($d); } if (is_array($d)) { /* * Return array converted to object * Using __FUNCTION__ (Magic constant) * for recursive call */ return array_map(__FUNCTION__, $d); } else { // Return array return $d; } }
回答1:
The lazy one-liner method
You can do this in a one liner using the JSON methods if you're willing to lose a tiny bit of performance (though some have reported it being faster than iterating through the objects recursively - most likely because PHP is slow at calling functions). "But I already did this" you say. Not exactly - you used json_decode
on the array, but you need to encode it with json_encode
first.
Requirements
The json_encode
and json_decode
methods. These are automatically bundled in PHP 5.2.0 and up. If you use any older version there's also a PECL library (that said, in that case you should really update your PHP installation. Support for 5.1 stopped in 2006.)
Converting an array
/stdClass
-> stdClass
$stdClass = json_decode(json_encode($booking));
Converting an array
/stdClass
-> array
The manual specifies the second argument of json_decode
as:
assoc
When TRUE
, returned objects will be converted into associative arrays.
Hence the following line will convert your entire object into an array:
$array = json_decode(json_encode($booking), true);
回答2:
use this function to get a standard array back of the type you are after...
return get_object_vars($booking);
回答3:
Since it's an array before you cast it, casting it makes no sense.
You may want a recursive cast, which would look something like this:
function arrayCastRecursive($array) { if (is_array($array)) { foreach ($array as $key => $value) { if (is_array($value)) { $array[$key] = arrayCastRecursive($value); } if ($value instanceof stdClass) { $array[$key] = arrayCastRecursive((array)$value); } } } if ($array instanceof stdClass) { return arrayCastRecursive((array)$array); } return $array; }
Usage:
$obj = new stdClass; $obj->aaa = 'asdf'; $obj->bbb = 'adsf43'; $arr = array('asdf', array($obj, 3)); var_dump($arr); $arr = arrayCastRecursive($arr); var_dump($arr);
Result before:
array 0 => string 'asdf' (length = 4) 1 => array 0 => object(stdClass)[1] public 'aaa' => string 'asdf' (length = 4) public 'bbb' => string 'adsf43' (length = 6) 1 => int 3
Result after:
array 0 => string 'asdf' (length = 4) 1 => array 0 => array 'aaa' => string 'asdf' (length = 4) 'bbb' => string 'adsf43' (length = 6) 1 => int 3
Note:
Tested and working with complex arrays where a stdClass object can contain other stdClass objects.
回答4:
This function worked for me:
function cvf_convert_object_to_array($data) { if (is_object($data)) { $data = get_object_vars($data); } if (is_array($data)) { return array_map(__FUNCTION__, $data); } else { return $data; } }
Reference: http://carlofontanos.com/convert-stdclass-object-to-array-in-php/
回答5:
Please use following php function to convert php stdClass to array
get_object_vars($data)
回答6:
Just googled it, and found here a handy function that is useful for converting stdClass object to array recursively.
EDIT: I updated this answer with content from linked source (which is also changed now), thanks to mason81 for suggesting me.
回答7:
Here is a version of Carlo's answer that can be used in a class:
class Formatter { public function objectToArray($data) { if (is_object($data)) { $data = get_object_vars($data); } if (is_array($data)) { return array_map(array($this, 'objectToArray'), $data); } return $data; } }
回答8:
The following code will read all emails & print the Subject, Body & Date.
$objectOverview: '; print_r($objectOverview); print '
objectSubject ='.($objectOverview[0]->subject)); print '
objectDate ='.($objectOverview[0]->date); $bodyMessage=imap_fetchbody($imap,$count,1); print '
bodyMessage ='.$bodyMessage.'
'; } //for ($count=1; $count
This outputs the following:
$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello [from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100 [message_id] => [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 [answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) ) objectSubject =Hello objectDate =Sun, 16 Jul 2017 20:23:18 +0100 bodyMessage =Test
Having struggled with various suggestions I have used trial & error to come up with this solution. Hope it helps.