2024-10-01 06:00:07

php stdClass数组

我有一个问题转换对象stdClass到数组。 我是这样尝试的:

return (array) $booking;

or

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

or

return (array) json_decode($booking);

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

转换前的数组:

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

后cast是空NULL如果我尝试做一个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;
        }
    }

当前回答

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

return get_object_vars($booking);

其他回答

惰性一行程序方法

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

需求

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


转换数组/stdClass -> stdClass

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

转换数组/stdClass ->数组

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

协会 当为TRUE时,返回的对象将被转换为关联数组。

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

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

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

get_object_vars($data)

下面的代码将读取所有电子邮件并打印主题,正文和日期。

<?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 

在与各种建议作斗争后,我使用反复试验的方法提出了这个解决方案。希望能有所帮助。

刚刚谷歌了一下,在这里发现了一个方便的函数,用于递归地将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建议我。

以下是我如何在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);
}