如何在PHP7中将对象转换为数组?

6 浏览
0 Comments

如何在PHP7中将对象转换为数组?

我正在将一个与我的网站集成的API与以对象存储的数据进行交互,而我的代码是使用数组编写的。

我想要一个快速而简单的函数来将对象转换为数组。

0
0 Comments

问题的原因是在PHP中将对象转换为数组的需求。解决方法是使用JSON编码/解码函数来实现对象到关联数组的转换。具体的解决方案是使用以下代码:

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

这是一种递归转换的解决方法,但性能可能不太好。需要注意的是,在PHP 5.5版本中可能无法正常工作,会返回一个对象数组。

一个用户表示这个解决方案仍然有效,只需要将第二个参数设置为true即可。另一个用户确认这个解决方案在PHP 5.6.25中有效。

然而,这种方法在处理二进制值时会返回false。

另一种解决方案是通过实现JsonSerializable接口来控制导出的内容。但需要注意可能会导致无限循环和内存错误。

有用户提到使用$arr = (array) $obj;进行类型转换不起作用,但使用上述的JSON解码方法可以正常工作。

另外,有用户表示这种方法在处理特殊字符时可能会出错,但大多数情况下JSON应该可以正确编码/解码UTF-8字符。

可以通过JSON编码/解码函数来将对象转换为数组。如果需要更复杂的控制或处理特殊情况,则可以实现JsonSerializable接口来自定义导出的内容。

0
0 Comments

如何在PHP7中将对象转换为数组?

在Google搜索“PHP对象转换为关联数组”的第一个结果中,我们有以下代码:

/**
 *  array|object $data
 *  array
 */
function object_to_array($data)
{
    $result = [];
    foreach ($data as $key => $value)
    {
        $result[$key] = (is_array($value) || is_object($value)) ? object_to_array($value) : $value;
    }
    return $result;
}

原始来源是codesnippets.joyent.com,根据评论进行了更改;还可以参考PHP手册中的“对象迭代”。

与使用json_decode & json_encode的解决方案进行比较,这个方法似乎更快。这是一个随机的性能测试(使用简单的时间测量):

$obj = (object) [
    'name'    =>'Mike',
    'surname' =>'Jovanson',
    'age'     =>'45',
    'time'    =>1234567890,
    'country' =>'Germany',
];
##### 100 000 cycles ######
* json_decode(json_encode($var))   : 4.15 sec
* object_to_array($var)            : 0.93 sec

个人而言,我不喜欢为每个值重新调用函数的想法。我有一个类似的版本,但只有3行代码:

function objectToArray($o) { 
    $a = array(); 
    foreach ($o as $k => $v) 
        $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; 
    return $a; 
}

这个版本只是将不是对象或数组的内容设置为对应的值,并继续进行下去,而不需要重复调用方法,除非有必要。

第一个搜索结果为“php对象转换为关联数组”的是stackoverflow.com/questions/4345554/…

这个方法(以及stackoverflow.com/a/16111687/470749中的版本)在我的情况下似乎比json_encode的选项慢得多。我不知道为什么这些方法会更可取。

json_encode和json_decode对于NaN和INFINITE值的浮点数不起作用,可能还有其他我无法想到的问题,但对于许多情况来说,这可能是一个更好的选择。至于优化,需要考虑上下文-让我推广一下我在这个主题上写的一篇文章evidentlycube.com/blog/game-optimization/when-to-optimize。总结起来就是,不要对不占用大部分运行时间的东西进行不必要的优化,因为在整个应用程序的背景下,这些优势是无意义的。

我同意你对不必要优化的总结性建议,但在我的情况下,我之所以发现json_encode和json_decode速度慢是因为它们明显减慢了我的页面加载时间。所以我需要找到一个更快的方法。我的新方法是将json_encode和json_decode从循环中分离出来,只在外部运行一次,然后在其组件上运行循环。

你的方法已经整合到答案中。

看起来不能处理私有字段。

0
0 Comments

如何在PHP7中将对象转换为数组?

问题的原因是,有时候我们需要将一个对象转换为数组。这可能是因为我们需要以数组的形式来处理对象的属性,或者是为了方便地使用数组的方法和函数。在PHP中,可以通过类型转换来将对象转换为数组。只需简单地对对象进行类型转换即可。以下是一个示例代码:

$array = (array) $yourObject;

根据PHP文档中关于数组的说明,如果将一个对象转换为数组,结果将是一个数组,其元素是对象的属性。键是成员变量的名称,但有一些例外情况:无法访问整数属性;私有变量的变量名前面加上类名;受保护的变量的变量名前面加上'*'。这些前缀值在两侧都有空字节。以下是一个示例代码:

class Foo
{
    private $foo;
    protected $bar;
    public $baz;
    public function __construct()
    {
        $this->foo = 1;
        $this->bar = 2;
        $this->baz = new StdClass;
    }
}
var_dump((array) new Foo);

输出结果如下:

array(3) {
  '\0Foo\0foo' => int(1)
  '\0*\0bar' => int(2)
  'baz' => class stdClass#2 (0) {}
}

需要注意的是,这种类型转换不会对对象图进行深度转换,而且需要应用空字节(如手册中所述)来访问任何非公共属性。所以这种方法最适用于将StdClass对象或只有公共属性的对象转换为数组。对于快速简单的转换而言,这种方法是可以接受的。

另外,还可以考虑使用ArrayAccess接口与此解决方案相结合。详情请参阅PHP文档中关于ArrayAccess接口的说明。

需要注意的是,如果对象包含指向我们将要转换的对象的子对象,这种转换将失败,会导致无限循环。

如果对象具有整数键,它们将被转换为字符串,这可能会导致严重问题。例如,`[1 => "one"]`会变成`["1" => "one"]`。

如果想将数组转换回Collection对象,可以使用`(object) $array`进行类型转换。将类型转换为其他对象则需要使用某种技巧,具体可以参考相关文档。

需要注意的是,使用`(array)`和`(object)`进行类型转换在所有版本的PHP 4.3之后都能可靠地工作。如果出现语法错误,那么可能是做错了什么。

这种方法不会进行递归转换。如果对象包含子对象,这些子对象指向我们将要转换的对象,那么仍将保留这些子对象的引用。

,将对象转换为数组的方法是通过类型转换`(array) $object`来实现的。这种方法适用于将StdClass对象或只有公共属性的对象转换为数组。然而,需要注意的是,这种方法不会进行深度转换,也不适用于包含子对象的情况。如果需要进行深度转换或处理复杂对象,可能需要使用其他的方法。

0