PHP如何保存JSON筛选结果并按州分组展示城市
按州分组展示城市的解决方案
第一步:修正控制器逻辑,实现数据分组
你的现有代码存在两个核心问题:return语句放在foreach循环内导致循环提前终止,且直接echo输出无法将结构化数据传递给视图。以下是优化后的控制器代码:
public function states() { // 获取并解析城市JSON数据 $json = file_get_contents('https://api.cms.diebestenderstadt.de/cities/v1/'); $cities = json_decode($json, true); // 定义需要展示的州列表,替代冗余的elseif判断 $targetStates = ['Sachsen', 'Nordrhein-Westfalen', 'Baden-Württemberg', 'Bayern']; // 初始化分组数组,键为州名,值为对应州的城市集合 $groupedCities = []; foreach ($cities as $city) { // 仅保留目标州的城市 if (in_array($city['state'], $targetStates)) { // 将城市归入对应州的分组 $groupedCities[$city['state']][] = $city; } } // 将分组后的数据传递给视图 return view("index.states")->with("groupedCities", $groupedCities); }
代码说明:
- 用
$targetStates数组统一管理需要展示的州,后续修改只需调整数组内容,无需修改判断逻辑 $groupedCities是多维数组,自动按州名对城市进行归类,方便视图层遍历- 移除了循环内的
return,确保所有数据都能被处理
第二步:在视图中渲染分组数据
假设你的视图文件是resources/views/index/states.blade.php,可以通过嵌套循环实现按州分组展示,并生成站内城市链接:
<div class="state-container"> @foreach($groupedCities as $stateName => $stateCities) <section class="state-section"> <h2>{{ $stateName }}</h2> <ul class="city-list"> @foreach($stateCities as $city) <!-- 根据你的站内路由规则调整链接地址,示例为 /cities/{城市ID} --> <li><a href="/cities/{{ $city['id'] }}">{{ $city['name'] }}</a></li> @endforeach </ul> </section> @endforeach </div>
视图说明:
- 外层循环遍历每个州,输出州名作为分组标题
- 内层循环遍历当前州下的所有城市,生成指向对应城市页面的链接
- 可以添加自定义CSS样式美化分组布局,比如给
.state-section添加间距、给.city-list设置列表样式
可选优化建议
- 替换
file_get_contents:如果是Laravel项目,推荐使用框架内置的Http客户端,处理请求错误更方便:use Illuminate\Support\Facades\Http; public function states() { $response = Http::get('https://api.cms.diebestenderstadt.de/cities/v1/'); if (!$response->successful()) { // 处理API请求失败的情况,比如返回错误视图 return view('errors.api-failed'); } $cities = $response->json(); // 后续分组逻辑同上 } - 缓存API数据:如果城市数据不会频繁更新,可以缓存结果,减少API调用次数:
$cities = Cache::remember('cities_data', 3600, function () { $json = file_get_contents('https://api.cms.diebestenderstadt.de/cities/v1/'); return json_decode($json, true); }); - 排序州分组:如果需要按州名字母顺序展示,可以在传递视图前对分组数组排序:
ksort($groupedCities); // 按州名字母升序排序
内容的提问来源于stack exchange,提问作者ItsRay
相关产品推荐
相关产品推荐

