238

我在将对象 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"   } } 

如果我尝试制作,则演员后为空 NULLvar_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;
        }
    }
4

11 回答 11

505

懒惰的单线方法

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

要求

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


转换array/ stdClass->stdClass

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

转换array/ stdClass->array

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

assoc
TRUE,返回的对象将被转换为关联数组。

因此,以下行会将您的整个对象转换为数组:

$array = json_decode(json_encode($booking), true);
于 2013-09-02T15:49:30.833 回答
98

使用此函数获取您所追求的类型的标准数组...

return get_object_vars($booking);
于 2013-11-19T17:50:58.920 回答
32

使用内置的类型转换功能,只需键入

$realArray = (array)$stdClass;
于 2019-09-03T05:44:54.623 回答
19

因为在你施放它之前它是一个数组,所以施放它是没有意义的。

您可能需要一个递归转换,看起来像这样:

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

于 2013-09-02T15:50:44.750 回答
17

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

get_object_vars($data)
于 2017-05-11T21:24:23.023 回答
15

这个功能对我有用:

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/

于 2015-01-08T16:04:56.787 回答
4

刚用谷歌搜索了一下,在这里找到了一个方便的函数,它对于将 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 的建议。

于 2013-12-27T14:28:26.773 回答
0

这是我拥有的最好的 Object to Array 函数 - 递归工作:

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);
于 2020-03-20T22:10:20.730 回答
0

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

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

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

于 2017-07-17T10:15:16.413 回答
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;
    }
}
于 2016-05-17T15:41:14.743 回答
0

这是我在没有 Eloquent 的情况下在 Laravel 中使用它的方法。

function getUsers(){ 

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

   return view('page')->with('data', $data);
}
于 2021-12-14T09:26:49.463 回答