PHP的stdClass数组
我有一个问题,将对象stdClass转换为数组。 我尝试过这种方式:
return (array) $booking;
要么
return (array) json_decode($booking,true);
要么
return (array) json_decode($booking);
转换之前的数组是完整的一个logging,在我尝试转换后是空的。 如何在不删除行的情况下进行转换/转换?
施放之前的arrays:
array(1) { [0]=> object(stdClass)#23 (36) { ["id"]=> string(1) "2" ["name"]=> string(0) "" ["code"]=> string(5) "56/13" } }
如果我试图做一个var_dump($booking);
我也试过这个function,但总是空的:
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; } }
懒惰的单线程方法
如果你愿意失去一点点的性能(尽pipe有人报告说它比recursion迭代对象更快 – 很可能是因为PHP 在调用函数方面很慢),所以你可以用JSON方法在一行中做到这一点。 “ 但是我已经这样做了 ”你说。 不完全是 – 你在数组上使用json_decode
,但是你需要先用json_encode
进行编码。
要求
json_encode
和json_decode
方法。 这些自动绑定在PHP 5.2.0及以上。 如果你使用的是旧版本,那么还有一个PECL库 (在这种情况下,你应该更新你的PHP安装,2006年停止支持)
转换一个array
/ stdClass
– > stdClass
$stdClass = json_decode(json_encode($booking));
转换一个array
/ stdClass
– > array
该手册将json_decode
的第二个参数指定为:
ASSOC
当TRUE
,返回的对象将被转换为关联数组。
因此,下面这行会将你的整个对象转换成一个数组:
$array = json_decode(json_encode($booking), true);
使用这个函数来获得你之后的types的标准数组…
return get_object_vars($booking);
既然这是一个arrays之前,你施放它,铸造它是没有意义的。
你可能需要一个recursion的转换,看起来像这样:
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; }
用法:
$obj = new stdClass; $obj->aaa = 'asdf'; $obj->bbb = 'adsf43'; $arr = array('asdf', array($obj, 3)); var_dump($arr); $arr = arrayCastRecursive($arr); var_dump($arr);
结果之前:
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
之后的结果:
array 0 => string 'asdf' (length = 4) 1 => array 0 => array 'aaa' => string 'asdf' (length = 4) 'bbb' => string 'adsf43' (length = 6) 1 => int 3
注意:
testing并使用复杂数组,其中stdClass对象可以包含其他stdClass对象。
这个function对我有用:
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; } }
参考: http : //carlofontanos.com/convert-stdclass-object-to-array-in-php/
请使用下面的php函数将php stdClass转换为数组
get_object_vars($data)
刚刚google了一下,发现这里有一个方便的函数,它有助于recursion地将stdClass对象转换为数组。
<?php function object_to_array($object) { if (is_object($object)) { return array_map(__FUNCTION__, get_object_vars($object)); } else if (is_array($object)) { return array_map(__FUNCTION__, $object); } else { return $object; } } ?>
编辑 :我更新了这个答案与来自链接源的内容(现在也改变了),感谢mason81提示我。
下面是可以在课堂上使用的Carlo答案的一个版本:
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; } }
以下代码将读取所有电子邮件并打印主题,正文和date。
<?php $imap=imap_open("Mailbox","Email Address","Password"); if($imap){$fixMessages=1+imap_num_msg($imap); //Check no.of.msgs /* By adding 1 to "imap_num_msg($imap)" & starting at $count=1 the "Start" & "End" non-messages are ignored */ for ($count=1; $count<$fixMessages; $count++){ $objectOverview=imap_fetch_overview($imap,$count,0); print '<br>$objectOverview: '; print_r($objectOverview); print '<br>objectSubject ='.($objectOverview[0]->subject)); print '<br>objectDate ='.($objectOverview[0]->date); $bodyMessage=imap_fetchbody($imap,$count,1); print '<br>bodyMessage ='.$bodyMessage.'<br><br>'; } //for ($count=1; $count<$fixMessages; $count++) } //if($imap) imap_close($imap); ?>
这输出以下内容:
$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
经过各种各样的build议,我用了试验和错误来提出这个解决scheme。 希望能帮助到你。