将对象对象转换为对象数组(PHP,Laravel)

Posted

技术标签:

【中文标题】将对象对象转换为对象数组(PHP,Laravel)【英文标题】:Convert object of objects to array of objects (PHP, Laravel) 【发布时间】:2019-09-18 04:12:44 【问题描述】:

我正在使用 Eloquent 从 DB 返回一些数据并放入数组对象中。我对浏览器的响应对象以这种格式显示:

// response()->json($response, 200);


[
"id": 1,
"name": "car",
"make": ["bmw", "ford"]
"order": 1
,

"id": 2,
"name": "bike",
"make": ["aprilia"]
"order": 2
,

"id": 3,
"name": "boat",
"make": []
"order": 3
 ,
(...)
]

不过,在返回之前,我想在服务器端对其进行过滤。所以我只返回在"make" 数组中保存值的对象。

所以我正在运行这个循环:

        foreach ($response as $key => $transport) 

            if (count($response[$key]['make']) == 0) 
                unset($response[$key]);
            ;

        

php 所做的是将数组转换为对象,并为每个内部对象添加键。所以现在我的$response 看起来像:


// response()->json($response, 200);


 // notice here it has changed from array to object
  "0":  // notice here it has added key "0"
    "id": 1,
    "name": "car",
    "make": ["bmw", "ford"]
    "order": 1
  ,
    "1" :  // notice here it has added key "1"
    "id": 2,
    "name": "bike",
    "make": ["aprilia"]
    "order": 2
  ,
 (...)


首先 - 为什么? 第二个问题 - 如何防止/返回对象数组响应?

【问题讨论】:

是一样的。 PHP 中的每个数组默认都有 int 键。如何将数组转换回对象? 有也没有。当我从 JS 中选择这个对象时,它将被视为对象的对象,因此数组方法将不可用(map、filter 等)。从 DB 的初始转换必须通过 Laravel 的魔法collect() 方法发生。我尝试使用 Laravel 提供的toArray() 方法,但没有任何乐趣。 我猜你投错了。看这里:例如3v4l.org/ikRl4 我想我明白了,我只是创建了另一个数组,并在循环中不断将非空对象推送到新数组以最终返回它。这是一个步行,但有效。 澄清一下,使用array_values(),因为(array)会保留nun顺序索引。 【参考方案1】:

当您在 PHP 中从索引数组中取消设置值时,现有索引仍然存在。使用一个小范围整数的简单示例来说明,以下代码将数组中的所有奇数都取消设置:

$numbers = range(1, 5); // [1, 2, 3, 4, 5];

foreach ($numbers as $index => $number) 
    if ($number % 2 !== 0) 
        unset($numbers[$index]);
    


print_r($numbers);

产量:

Array
(
    [1] => 2
    [3] => 4
)

注意奇数元素被移除,但现有元素的索引被保留。由于这些间隙,此时数组没有按顺序索引。

这样做的结果是,当你 json_encode() 这个数组时,它假定这些非顺序索引(我们现在只称它们为键)将被保留,因此它会创建一个带有键的对象字面量。这些键是恰好是整数的字符串:

echo json_encode($numbers); // "1":2,"3":4 

使用array_values($numbers) 将重置数组的索引:

$reindexed = array_values($numbers);
echo json_encode($reindexed); // [2, 4]

注意:我在评论中提到可以使用(array) 强制转换为数组——这实际上是不正确的,因为它会保留非顺序索引。

希望这会有所帮助!

【讨论】:

以上是关于将对象对象转换为对象数组(PHP,Laravel)的主要内容,如果未能解决你的问题,请参考以下文章

laravel怎么把对象转换为数组

Laravel 集合将数组转换为对象

Laravel,将 JSON 数组转换为数组,只从数组中获取一个对象

在 Laravel 中将二维数组转换为 json 对象

将对象数组转换为 Vue js 和 php 中的对象

将 PHP 对象转换为关联数组