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