PHP的stdClass数组


195

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

如果我尝试使铸造后为空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;
        }
    }

php.net/var_dump ... php.net/var_export-之前returnjson_decode在我看来,在阵列上运行非常绝望,可能坐在电脑前太久了,现在该休息一下了吗?
hakre 2013年

只是为了澄清:var_dump($booking);输出NULL
hakre 2013年

投放是之后,如果我尝试打印此内容:$ booking [0] ['id']返回不存在的内容
Alessandro Minoccheri 2013年

您可能有兴趣阅读:如何在PHP中获得有用的错误消息?-无论如何,我是var_dump() 投演问的。不要重复使用相同的变量名btw。如果$booking是在投放之前的内容,则仍然应该是投放之前的内容,而不是之后的其他内容。输入变量和处理变量之间要有所不同,否则您将遇到无法再理解的问题。
hakre 2013年

缩短问题(例如删除自定义功能代码)可能有助于查看接受的答案而无需向下滚动
cnlevy 2015年

Answers:


430

所述懒惰单行方法

如果您愿意损失一点点性能,则可以使用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为:

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

因此,以下行将把整个对象转换成一个数组:

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

1
如果(array) $booking;var_dumpis中NULL(如OP所写),那么您猜这将返回什么代码?
hakre 2013年

@hakre好像不是将其NULL转换为数组之后。我认为OP的意思是NULL使用后json_decode($array)按照手册有意义。如果无法解码json,则返回NULL
h2ooooooo 2013年

4
@AlessandroMinoccheri之前不起作用的原因是在json_decode()数组上使用之前。json_decode应该在JSON字符串上使用。因此,如果我们先将其编码为JSON字符串json_encode然后再解码(使用JSON字符串),则可以正常工作。
h2ooooooo 2013年

3
是否所有人都忘记了您将丢失JSON规范中未定义的类型(例如日期)?如果使用这种方法,则需要一个reviver。仅当您具有数字,字符串和布尔值等基本类型时,这才是好方法。
Denis Pshenov 2014年

1
好答案,我一直在使用json_decode($ stdClass,true);)
didando8a 2015年


17

由于它是在强制转换之前的数组,因此强制转换毫无意义。

您可能需要递归转换,如下所示:

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


大。现在适用于包含stdClass对象的stdClass对象:)
Vlad Preda 2013年

14

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

get_object_vars($data)

2
请注意,此函数不是递归的。有关递归解决方案,请参阅Carlo Fontanos的答案。
Courtney Miles


12

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

$realArray = (array)$stdClass;

1
我更喜欢json_decode / encode,更干净+1
Logan

2
此方法更简洁,但是它也不是递归的,并且与get_object_vars()相同。尽管json_decode / encode方法具有hack的感觉,但它是递归工作的。
黛比五世

3

只是谷歌搜索,并在这里找到一个方便的函数,对于将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给我的建议。


1
下次,请包括来自链接源的相关内容。您提供的链接已更改,现在不相关且无用。
mason81 2014年

这就是我一直在寻找的,非常感谢。

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

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 

经过各种建议的努力,我使用了反复试验的方法来提出这个解决方案。希望能帮助到你。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.