我通过 运行 laravel collection returns 上的过滤方法得到的过滤结果一个新的 collection 具有不需要的索引

The filtered result I get by running the filter method on a laravel collection returns a new collection with an undesired index

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

让我们假设以下数据结构为 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'的collection格式,$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 发送回前端, 在邮递员中,我看到以下输出,

{
    "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”的钥匙,我想要的避难所就在 collection.

谁能帮我理解为什么会这样,以及如何摆脱它,因为我想在代码的后半部分访问 $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)documentation:

The values method returns a new collection with the keys reset to consecutive integers