如何将MySQL统计数整合到PHP数组并按州-城市-门店数格式展示
问题分析与解决方案
我看出来你的核心问题了——你的PHP代码既跳过了一半数据,又没把城市对应的门店数量(SQL返回的cnt字段)和城市名关联存储,导致后续无法正确展示城市(数量)的格式。
问题根源拆解
- 多余的
mysqli_fetch_assoc调用:你在while循环里刚拿到当前行的$row,又调用了$values = mysqli_fetch_assoc($result);,这会把结果集指针直接移到下一行,导致你丢失了一半的数据,而且$numStores拿到的是下一行的门店数,完全不匹配当前城市。 - 未关联城市与数量:你的
$rows[$row['state']][] = $city;只存储了城市名,没有把对应的cnt值一起存进去,后续遍历自然拿不到每个城市的门店数。
修正后的完整代码
首先保留你正确的SQL语句,然后调整PHP逻辑:
$sql ="SELECT DISTINCT city, state, stateAbv, COUNT(CASE WHEN open = 'Y' THEN 1 END) AS cnt FROM $tbl_name WHERE open = 'Y' GROUP BY city, state, stateAbv ORDER BY state;"; $result = mysqli_query($conn,$sql); $num_columns = 1; $rows = array(); // 修正循环:直接存储城市和对应的门店数 while($row = mysqli_fetch_assoc($result)){ $state = $row['state']; $city = $row['city']; $numStores = $row['cnt']; // 直接从当前行获取门店数,无需额外fetch if(!isset($rows[$state])){ $rows[$state] = array(); } // 将城市和数量以关联数组形式存入,方便后续调用 $rows[$state][] = [ 'city' => $city, 'cnt' => $numStores ]; } // 按预期格式输出 foreach($rows as $state => $cityList){ echo '<b>'. $state .'</b>'; // 如果你需要按列拆分城市(比如原代码的$num_columns) $cityChunks = array_chunk($cityList, $num_columns); foreach($cityChunks as $chunk){ foreach($chunk as $item){ echo " {$item['city']}({$item['cnt']})"; } } echo '<br>'; // 每个州结束后换行,可根据需求调整 }
关键改动说明
- 移除多余的fetch操作:直接从当前
$row中获取cnt,避免数据丢失和匹配错误。 - 关联存储城市与数量:将每个城市的信息以
['city' => 'xxx', 'cnt' => x]的关联数组形式存入$rows,确保城市和门店数始终绑定。 - 调整输出逻辑:遍历每个州的城市列表时,直接从关联数组中取出城市名和数量,拼接成你需要的
城市(数量)格式。
修正后,你的$rows数组结构会变成:
Array ( [Alabama] => Array ( [0] => Array ( [city] => Mobile [cnt] => 2 ) [1] => Array ( [city] => Auburn [cnt] => 4 ) [2] => Array ( [city] => Hoover [cnt] => 3 ) ) )
最终会输出符合你预期的格式:
<b>Alabama</b> Mobile(2) Auburn(4) Hoover(3)
内容的提问来源于stack exchange,提问作者kelsheikh
相关产品推荐
相关产品推荐

