Отфильтрованный результат, который я получаю, запустив метод фильтра в коллекции laravel, возвращает новую коллекцию с нежелательным индексом

#laravel #laravel-5 #laravel-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 в приведенной выше структуре данных и $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 as $nearest_shelter['2'] . Но проблема в том, что значение этого ключа меняется в зависимости от данных, которые я получаю из БД.

Один раз значение ключа было «1», затем, как только я добавил несколько новых записей в базу данных, оно стало «2». Кроме того, в этот раз не было ключа, помеченного как » 1 » или «2», и убежище, которое я хотел, находилось прямо в коллекции.

Может кто-нибудь, пожалуйста, помогите мне понять, почему это происходит и как от этого избавиться, так как я хочу получить доступ к значению $nearest_shelter внутри последних частей кода, и я не хочу получать подобный ключ, значение которого я заранее не знаю, чтобы получить доступ к $nearest_shelter более поздней части кода.

(Проект, над которым я работаю, использует laravel 5.2)

Спасибо.

Комментарии:

1. 2 берется из исходного индекса элемента (вы отфильтровали третий элемент массива). Если он всегда возвращает только один ключ, который вы можете использовать reset($nearest_shelter) для получения первого элемента массива

Ответ №1:

При фильтрации коллекции индекс сохраняется.

Это "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 Метод возвращает новую коллекцию с ключами, сброшенными до последовательных целых чисел