为了更容易理解这个问题,我将硬编码我正在使用集合的数据并解释这个问题。
让我们假设以下JSON格式的数据结构,
{
"shelters_with_linear_distances": [
{
"id": 3,
"shelterName": "Third Shelter",
"latitude": "5.0034000",
"longitude": "70.1230000",
"linear_distance": 3.1352984845527
},
{
"id": 4,
"shelterName": "Fourth Shelter",
"latitude": "5.1413000",
"longitude": "70.2250000",
"linear_distance": 2.7850629146201
},
{
"id": 5,
"shelterName": "Fifth Shelter",
"latitude": "5.2220000",
"longitude": "70.1320000",
"linear_distance": 2.6042789457753
}
]
}
下面的过滤器方法在上述数据结构中的集合格式为'shelters_with_linear_distance
'上运行,$minimum_distance_to_a_shelter
是一个动态计算的值,其数据类型为double
。
$nearest_shelter = $shelters_with_linear_distances_from_user
->filter(function ($shelter, $key) use ($minimum_distance_to_a_shelter) {
return $shelter['linear_distance'] == $minimum_distance_to_a_shelter;
});
这里的问题是,如果我将过滤器方法返回的值(这是$nearest_shelter
)作为JSON发送到前端,在postman中,我看到如下输出,
{
"nearest_shelter": {
"2": { // <------------------------------------ I can not figure out from where this key '2' is coming from.
"id": 5,
"shelterName": "Fifth Shelter",
"latitude": "5.2220000",
"longitude": "70.1320000",
"linear_distance": 2.6042789457753
}
}
}
问题是我无法找出我在上面一行代码中用箭头指向的键是从哪里来的。*)如果值'2'永远不会改变,那么在代码的后面部分,我总是可以访问$nearest_shelter
作为$nearest_shelter['2']
。但问题是,该键的值根据我从数据库接收到的数据而变化。
有一次键的值是'1',然后当我向数据库添加一些新记录时,它是'2'。还有一次,没有标记为"1"或"2"的键,我想要的庇护所直接在集合内。
有人能帮我理解为什么会发生这种情况,以及如何摆脱这种情况,因为我想在代码的后半部分访问$nearest_shelter
内部的值,我不想得到一个键,我不知道事先访问$nearest_shelter
的值,在代码的后面。
我正在做的项目使用laravel 5.2)
谢谢。
当您筛选一个集合时,索引将被保留。
"2"
是因为此元素是原始集合中的第三个元素(因此索引2)。
->values()
:
$nearest_shelter = $shelters_with_linear_distances_from_user
->filter(function ($shelter, $key) use ($minimum_distance_to_a_shelter) {
return $shelter['linear_distance'] == $minimum_distance_to_a_shelter;
})->values();
这样索引将被重置,并像往常一样从0开始。
来自文档(如您的问题所述的Laravel 5.2)文档:
values
方法返回一个新的集合,键值重置为连续整数