php stdClass到数组

Ale*_*eri 185 php arrays

我有一个问题,将对象stdClass转换为数组.我试过这样的方式:

return (array) $booking;
Run Code Online (Sandbox Code Playgroud)

要么

return (array) json_decode($booking,true);
Run Code Online (Sandbox Code Playgroud)

要么

return (array) json_decode($booking);
Run Code Online (Sandbox Code Playgroud)

在我尝试将其转换为空之后,演员阵容之前的数组已满了一条记录.如何在不删除行的情况下转换/转换它?

演员阵容前:

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

如果我尝试制作一个,则在施放后为空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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

h2o*_*ooo 394

所述懒惰单行方法

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

要求

json_encodejson_decode方法.它们自动捆绑在PHP 5.2.0及更高版本中.如果您使用任何旧版本,那么还有一个PECL库(在这种情况下,您应该真正更新您的PHP安装.在2006年停止支持5.1.)


转换array/ stdClass- >stdClass

$stdClass = json_decode(json_encode($booking));
Run Code Online (Sandbox Code Playgroud)

转换array/ stdClass- >array

手册指定了第二个参数json_decode:

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

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

$array = json_decode(json_encode($booking), true);
Run Code Online (Sandbox Code Playgroud)

  • @AlessandroMinoccheri之前没有工作的原因是在数组上使用`json_decode()`之前.`json_decode`应该用在JSON字符串上.因此,如果我们首先将它编码为JSON字符串(`json_encode`)和**然后**解码它(使用我们的JSON字符串),那么它工作正常. (4认同)
  • 是否所有人都忘记了您将丢失未在JSON规范中定义的类型(例如日期)?如果你使用这种方法,你需要有一个复活.如果您有基本类型(如数字,字符串和布尔值),这只会很好. (3认同)
  • 我不知道为什么,但是工作o_0谢谢+1 (2认同)

小智 66

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

return get_object_vars($booking);
Run Code Online (Sandbox Code Playgroud)

  • 这不是递归的 (17认同)
  • 这比 /sf/answers/1300383171/ 更好,因为它可以处理 unicode 字符串。 (2认同)
  • 然而,它不是递归的 (2认同)

Dav*_*ews 23

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

$realArray = (array)$stdClass;
Run Code Online (Sandbox Code Playgroud)

  • 这个方法更干净,但是它也不是递归的,并且与 get_object_vars() 的工作方式相同。虽然 json_decode/encode 方法有一种 hack 的感觉,但它是递归工作的。 (4认同)
  • 我更喜欢这个而不是 json_decode/encode,更干净+1 (3认同)
  • 如果您有多个深度对象,则只有第一个元素会被类型转换为数组。n+ 深层元素仍然是对象。所以使用 json_encode/decode 可以解决这个问题。 (3认同)

Vla*_*eda 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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);
Run Code Online (Sandbox Code Playgroud)

结果之前:

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
Run Code Online (Sandbox Code Playgroud)

结果之后:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3
Run Code Online (Sandbox Code Playgroud)

注意:

测试并使用复杂数组,其中stdClass对象可以包含其他stdClass对象.


小智 13

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

get_object_vars($data)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此函数不是递归的。请参阅** Carlo Fontanos **的答案以获取递归解决方案。 (2认同)

Car*_*nos 12

这个功能对我有用:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

参考:http://carlofontanos.com/convert-stdclass-object-to-array-in-php/