php stdClass数组

我有一个问题,将对象stdClass转换为数组。 我尝试过这样做:

return (array) $booking;

return (array) json_decode($booking,true);

return (array) json_decode($booking);

强制转换前的数组充满了一条记录,在我尝试强制转换后它是空的。 如何强制转换/不删除它的行?< / p >

转换前的数组:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } }

如果我尝试创建var_dump($booking);,则after cast为空NULL

我也尝试过这个功能,但总是空的:

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;
}
}
380485 次浏览

懒惰的一行方法

如果你愿意损失一点点性能,你可以使用JSON方法在一行中完成这一点(尽管有些人报告说它比递归遍历对象更快——很可能是因为PHP是调用函数速度慢)。“但是我已经做过了”你说。不完全是——你在数组上使用了json_decode,但你需要先用json_encode对它进行编码。

需求

json_encodejson_decode方法。在PHP 5.2.0及更高版本中会自动绑定这些功能。如果你使用任何旧版本,还有一个PECL图书馆(也就是说,在这种情况下,你应该真的更新你的PHP安装。对5.1的支持在2006年停止。)


转换array/stdClass -> stdClass

$stdClass = json_decode(json_encode($booking));

转换array/stdClass -> array

手册将json_decode的第二个参数指定为:

< p > 协会 < br > TRUE时,返回的对象将转换为关联数组

因此,下面这行代码将把你的整个对象转换成一个数组:

$array = json_decode(json_encode($booking), true);

由于在强制转换之前它是一个数组,因此强制转换没有任何意义。

你可能想要一个递归强制转换,它看起来像这样:

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对象。

使用这个函数可以得到一个标准数组,返回你想要的类型…

return get_object_vars($booking);

刚刚谷歌了一下,发现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建议我。

这个函数对我有用:

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/

以下是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;
}
}

请使用以下php函数将php stdClass转换为数组

get_object_vars($data)

下面的代码将读取所有电子邮件&打印主题,主体和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

在与各种建议作斗争之后,我使用了trial &提出这个解决方案的错误。希望能有所帮助。

使用内置的类型转换功能,简单地键入

$realArray = (array)$stdClass;

这是我拥有的最好的对象到数组的函数-递归地工作:

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

以下是我如何在Laravel中使用它而没有Eloquent。

function getUsers(){


$users = DB::select('select * from users');
$data = json_decode(json_encode($users), true); // to array


return view('page')->with('data', $data);
}