PHP实现按房屋ID分栏显示用户名单:解决仅部分列显示问题
解决用户按房屋分组显示在独立列的问题
我一眼就看出问题出在哪了——你的用户结果集指针没有重置,导致除了第一列之外,后面的循环都读不到用户数据!下面给你详细分析和修改方案:
问题根源
你代码里的$unityResult是从getUnityEmail()获取的用户结果集,第一次循环执行while ($row_unity = mysqli_fetch_array($unityResult))时,已经把结果集的指针移到了末尾。后续循环时,指针没有回到开头,所以while循环直接跳过,自然显示不出用户名单。另外你用硬编码的$numbers字符串来对应房屋ID,既不灵活也容易出错,不如直接用房屋表的真实数据。
修改后的完整代码
// 1. 先把用户数据按fkhouseid分组存入数组,避免重复遍历结果集 $unityResult = getUnityEmail(); $usersByHouse = []; while ($row_unity = mysqli_fetch_array($unityResult)) { $houseId = $row_unity['fkhouseid']; // 把同一房屋的用户放到对应分组里 if (!isset($usersByHouse[$houseId])) { $usersByHouse[$houseId] = []; } $usersByHouse[$houseId][] = $row_unity; } // 2. 遍历房屋数据,生成对应列 $houseResult = getHouses(); $count = mysqli_num_rows($houseResult); for ($x=0;$x<$count;$x++){ $row_house = mysqli_fetch_array($houseResult); $houseId = $row_house['id']; // 假设房屋表的主键是id,根据你的实际字段调整 $houseLetter = ''; // 根据房屋ID获取对应的标识字母,也可以直接从房屋表读取名称 switch($houseId) { case 1: $houseLetter = 'u'; break; case 2: $houseLetter = 'n'; break; case 3: $houseLetter = 'i'; break; case 4: $houseLetter = 't'; break; case 5: $houseLetter = 'y'; break; default: $houseLetter = '未知'; break; } echo "<div id='memberList$x' style='display:inline-block;vertical-align:top'>"; echo "<fieldset class=fieldname style='display:inline'>"; echo "<legend class=name_legend>$houseLetter</legend>"; echo "<ul class='list'>"; // 3. 显示当前房屋的用户 if (isset($usersByHouse[$houseId])) { foreach ($usersByHouse[$houseId] as $user) { format_member_list_filters($user); } } echo "</ul>"; echo "</fieldset>"; echo "<br>"; echo "</div>"; }
关键改动说明
- 提前分组用户数据:把用户结果集一次性遍历转成按
fkhouseid分组的数组$usersByHouse,后续直接通过房屋ID取数据,避免了重复遍历结果集和指针重置的问题,效率也更高。 - 使用真实房屋数据:直接从
houseResult里读取房屋ID,替代硬编码的$numbers,如果后续房屋ID有变化,代码不需要修改。 - 移除不必要的指针操作:原来的
mysqli_data_seek($houseResult, 0);是多余的,因为我们是按顺序遍历房屋结果集,每次循环读取一行即可。
内容的提问来源于stack exchange,提问作者Yevgeniy Bagackiy
相关产品推荐
相关产品推荐

