Dom*_*rov 5 php arrays object type-conversion laravel
我正在使用 Eloquent 从数据库返回一些数据并放入数组对象中。我对浏览器的响应对象以这种格式显示:
// 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
},
(...)
]
Run Code Online (Sandbox Code Playgroud)
不过,在返回之前,我想在服务器端对其进行过滤。所以我只返回在"make"数组中保存值的对象。
所以我正在运行这个循环:
foreach ($response as $key => $transport) {
if (count($response[$key]['make']) == 0) {
unset($response[$key]);
};
}
Run Code Online (Sandbox Code Playgroud)
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
},
(...)
}
Run Code Online (Sandbox Code Playgroud)
首先——为什么?第二个问题 - 如何防止/返回对象数组响应?
当您从 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);
Run Code Online (Sandbox Code Playgroud)
其中产生:
Array
(
[1] => 2
[3] => 4
)
Run Code Online (Sandbox Code Playgroud)
请注意,奇数元素被删除,但现有元素的索引被保留。由于这些间隙,此时数组未按顺序编入索引。
这样做的结果是,当你使用json_encode()这个数组时,它假设这些非顺序索引(我们现在称之为键)将被保留,因此它会创建一个带有键的对象文字。这些键是恰好是整数的字符串:
Array
(
[1] => 2
[3] => 4
)
Run Code Online (Sandbox Code Playgroud)
使用array_values($numbers)将重置数组的索引:
echo json_encode($numbers); // {"1":2,"3":4}
Run Code Online (Sandbox Code Playgroud)
注意:我在评论中提到你可以使用(array)- 这实际上是不正确的,因为它会保留非顺序索引。
希望这可以帮助!