如何在PHP7中将对象转换为数组?
问题的原因是在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接口来自定义导出的内容。
如何在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从循环中分离出来,只在外部运行一次,然后在其组件上运行循环。
你的方法已经整合到答案中。
看起来不能处理私有字段。
如何在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对象或只有公共属性的对象转换为数组。然而,需要注意的是,这种方法不会进行深度转换,也不适用于包含子对象的情况。如果需要进行深度转换或处理复杂对象,可能需要使用其他的方法。