通过在laravel集合上运行filter方法获得的过滤结果返回一个具有不需要的索引的新集合



为了更容易理解这个问题,我将硬编码我正在使用集合的数据并解释这个问题。

让我们假设以下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方法返回一个新的集合,键值重置为连续整数

相关内容

最新更新