CakePHP1.2中如何在foreach里按country_id统计projects表行数
问题排查与解决方案
该需求完全可以实现,你的代码存在多处逻辑错误,具体问题和修复方案如下:
原有代码的问题
- 条件判断完全无效:每次循环都将
$country_count_each赋值为当前项目的country_id,紧接着判断二者相等,该条件永远为true,没有任何过滤作用 - 计数逻辑错误:你执行的是
$count_country += $country_count_each,是把国家ID的值累加,不是统计项目个数,正确的计数应该每次加1 - 没有分组统计逻辑:代码会为每一个项目单独输出一行表格,而不是每个国家对应一行统计结果
- 变量
$tt未定义,无法正常输出国家名称
推荐解决方案(CakePHP原生查询,效率更高)
直接通过CakePHP 1.2的查询语法从数据库层面完成统计,无需PHP循环处理:
- 控制器层查询统计数据
// 在Project对应的控制器方法中执行查询 $countryStats = $this->Project->find('all', array( 'fields' => array('Project.country_id', 'COUNT(Project.id) as project_count'), 'group' => array('Project.country_id') )); $this->set('countryStats', $countryStats);
- 视图层渲染表格
<table> <tr> <th style="width: 30%">Country ID</th> <th style="width: 30%">Country Name</th> <th style="width: 30%">Number of Projects</th> </tr> <?php foreach ($countryStats as $stat): ?> <tr> <td><?php echo $stat['Project']['country_id']; ?></td> <td><?php // 如果你配置了Project和Country的关联,这里直接输出 $stat['Country']['name']即可 echo '对应国家名称'; ?></td> <td><?php echo $stat[0]['project_count']; ?></td> </tr> <?php endforeach; ?> </table>
备选方案(基于已有$projects数组用PHP循环统计)
如果你必须基于已经查询到的$projects数组做统计,写法如下:
<table> <tr> <th style="width: 30%">Country ID</th> <th style="width: 30%">Country Name</th> <th style="width: 30%">Number of Projects</th> </tr> <?php // 第一步先完成分组统计 $countryCount = []; foreach ($projects as $project) { $cid = $project['Project']['country_id']; isset($countryCount[$cid]) ? $countryCount[$cid]++ : $countryCount[$cid] = 1; } // 第二步遍历统计结果输出 foreach ($countryCount as $cid => $num): ?> <tr> <td><?php echo $cid; ?></td> <td><?php echo '国家名称'.$cid; // 替换为实际取国家名的逻辑 ?></td> <td><?php echo $num; ?></td> </tr> <?php endforeach; ?> </table>
内容的提问来源于stack exchange,提问作者salgergawi
相关产品推荐
相关产品推荐

