将stdClass对象转换为数组时遇到问题。 我试过这样的方式:
return (array) $booking;
或
return (array) json_decode($booking,true);
或
return (array) json_decode($booking);
在我尝试将其转换为空之后,演员阵容之前的数组已满了一条记录。 如何在不删除行的情况下转换/转换它?
演员之前的数组:
array(1) { [0]=> object(stdClass)#23 (36) { ["id"]=> string(1) "2" ["name"]=> string(0) "" ["code"]=> string(5) "56/13" } }
如果我尝试制作var_dump($booking);
,当施放为空时为空
我也试过这个功能,但总是空着:
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;
}
}
答案 0 :(得分:368)
如果你愿意失去一点点性能,你可以使用JSON方法在一个内核中执行此操作(尽管有些人报告它比以递归方式迭代对象更快 - 很可能是因为PHP是{{3 }})。 “但我已经做了这个”你说。不完全是 - 您在数组上使用了slow at calling functions,但您需要先使用json_decode
对其进行编码。
json_encode
和json_encode
方法。它们自动捆绑在PHP 5.2.0及更高版本中。如果您使用任何旧版本,那么还有一个json_decode
(在这种情况下,您应该真的更新您的PHP安装。在2006年停止支持5.1。)
array
/ stdClass
- > stdClass
$stdClass = json_decode(json_encode($booking));
array
/ stdClass
- > array
本手册将PECL library的第二个参数指定为:
<强> ASSOC 强>
当TRUE
时,返回的对象将被转换为关联数组。
因此,以下行将整个对象转换为数组:
$array = json_decode(json_encode($booking), true);
答案 1 :(得分:59)
使用此函数获取您所追求的类型的标准数组...
return get_object_vars($booking);
答案 2 :(得分:16)
因为在你施放它之前它是一个数组,所以投射它是没有意义的。
你可能想要一个递归演员,看起来像这样:
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
注意:强>
测试并使用复杂数组,其中stdClass对象可以包含其他stdClass对象。
答案 3 :(得分:13)
请使用以下php函数将php stdClass转换为数组
get_object_vars($data)
答案 4 :(得分:11)
这个功能对我有用:
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/
答案 5 :(得分:5)
使用内置的类型转换功能,只需键入
$realArray = (array)$stdClass;
答案 6 :(得分:4)
直接用Google搜索,发现 here 一个方便的函数,可用于递归地将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建议我。
答案 7 :(得分:0)
以下是可以在课堂上使用的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;
}
}
答案 8 :(得分:0)
以下代码将阅读所有电子邮件&amp;打印主题,身体和日期。
<?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
我已经尝试过各种各样的建议。错误提出这个解决方案。希望它有所帮助。
答案 9 :(得分:0)
这是我拥有的最好的“对象到数组”功能-递归工作:
function object_to_array($obj, &$arr){
if(!is_object($obj) && !is_array($obj)){
$arr = $obj;
return $arr;
}
foreach ($obj as $key => $value)
{
if (!empty($value))
{
$arr[$key] = array();
object_to_array_v2($value, $arr[$key]);
}
else
{
$arr[$key] = $value;
}
}
return $arr;
}
$ clean_array = object_to_array($ object_data_here);