将对象对象转换为对象数组(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)的主要内容,如果未能解决你的问题,请参考以下文章