You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:20:30