为了账号安全,请及时绑定邮箱和手机立即绑定

如何将普通嵌套数组转换为实体对象集合?

如何将普通嵌套数组转换为实体对象集合?

PHP
GCT1015 2022-01-08 16:55:12
我有一个 PHP 普通数组,我需要将其转换为它的原始实体。例子:class Contact{    protected $name;    getName(){}    setName(){}}这通过 API 来回发送,并且在某些时候我将该联系人作为数组元素:$example = ['name'=>'Foo Bar'];我想把它作为一Contact堂课回来。目前,我可以通过序列化/反序列化来做到这一点,但我希望有一种更有效的方法:foreach($examples as $example) {    $temp    = $this->serializer->serialize($example, 'json');    $contact = $this->serializer->deserialize($temp, Contact::class, 'json');}这有效,$contact现在是Contact. 但我必须一次性对 100 个项目执行此操作,可能更多。我正在考虑创建一种toObject()方法,通过键分配值,但这似乎并没有好多少。有没有办法在不编写我自己的逻辑或执行额外的序列化步骤的情况下完成此操作?请注意:我得到了数据数组,我无法得到“原始”json。请照原样接受。
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

从原始 JSON 输入反规范化

如果您从 API 获取信息,您可能会取消 JSON 转换并直接处理输入,因为 API 很可能不是向您发送本机数组,而是您正在转换为数组的 JSON观点


Serializer 组件也可以直接处理数组。


假设输入 JSON 如下:


$data = '[

   {

     "name": "Mary"

   },

   {

     "name": "Jane",

   },

   {

     "name": "Alice"

   }

]';

你可以打电话deserialize()说你期望Contact[]在你的输入数据中:


$contacts = $serializer->deserialize($data, Contact::class . '[]', 'json');

这将Contact一步一步为您提供一个数组。


从数组到对象的非规范化

如果由于某种原因原始输入不可用或不易序列化,并且您确实需要一个一个地从数组转换为对象,并且您的对象具有与您在问题中显示的设置器类似的设置器;您可以简单地使用GetSetMethodNormalizer(比 Serializer 组件内部使用的规范化器之一)。


例如:


$contacts = [

  ['name' => 'Mary'],

  ['name' => 'Jane'],

  ['name' => 'Alice'],

];


$normalizer = new GetSetMethodNormalizer();

foreach($contacts as $arrayContact){

    $contact = $normalizer->denormalize(Contact::class, $arrayContact);

    // do something with $contact;

}


查看完整回答
反对 回复 2022-01-08
  • 1 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信