Laravel 5.2集合调用filter方法返回带未知索引的结果如何解决?
动态索引产生的原因
Laravel 集合的 filter() 方法执行筛选操作时,会默认保留原集合的数组索引。你给出的示例中原集合共有3个元素,符合筛选条件的是原索引为2的元素,filter() 执行后不会自动重置索引,因此返回的新集合就保留了原索引2。
PHP数组转JSON时,如果索引不是从0开始的连续正整数,会被解析为对象而非数组,因此返回给前端的结构中就出现了这个动态的数字键,该键值就是符合条件的元素在原集合中的原始索引,自然会随数据源变化而变动。
解决方案
根据你的使用场景可以选择以下两种处理方式:
场景1:仅需要获取符合条件的单个避难所数据
在filter()之后链式调用first()方法,直接返回匹配到的第一个元素,无需处理索引:
$nearest_shelter = $shelters_with_linear_distances_from_user ->filter(function ($shelter, $key) use ($minimum_distance_to_a_shelter) { // 补充:浮点数比较建议用差值小于阈值的方式避免精度问题 return abs($shelter['linear_distance'] - $minimum_distance_to_a_shelter) < 0.00001; }) ->first();
该方式返回的是单条数据对象,转JSON后结构为:
{ "nearest_shelter": { "id": 5, "shelterName": "Fifth Shelter", "latitude": "5.2220000", "longitude": "70.1320000", "linear_distance": 2.6042789457753 } }
直接访问属性即可拿到数据。
场景2:需要保留所有符合条件的多条数据
在filter()之后链式调用values()方法,该方法会重置集合的索引为从0开始的连续正整数,转JSON后会被解析为普通数组:
$nearest_shelter = $shelters_with_linear_distances_from_user ->filter(function ($shelter, $key) use ($minimum_distance_to_a_shelter) { return abs($shelter['linear_distance'] - $minimum_distance_to_a_shelter) < 0.00001; }) ->values();
该方式返回的是索引数组,转JSON后结构为:
{ "nearest_shelter": [ { "id": 5, "shelterName": "Fifth Shelter", "latitude": "5.2220000", "longitude": "70.1320000", "linear_distance": 2.6042789457753 } ] }
直接取下标0即可访问第一条匹配数据。
内容的提问来源于stack exchange,提问作者NewPythoneer
相关产品推荐
相关产品推荐

