PHP计算在许多列中包含相同值的MYSQL行
Posted
技术标签:
【中文标题】PHP计算在许多列中包含相同值的MYSQL行【英文标题】:PHP counting MYSQL rows that contain the same value in many columns 【发布时间】:2016-05-01 22:20:33 【问题描述】:这是我的表格的内容:
如何计算不同表格单元格中的所有名称以获得这样的结果?
鲍勃-7 Alex-3 伊万-5 尼娜-5 .........
使用此代码:
<?php
$q= mysqli_query($db, 'SELECT * FROM names');
while ($all = mysqli_fetch_array($q))
$k1= $all['Name1'];
$k2= $all['Name2'];
$k3= $all['Name3'];
$k4= $all['Name4'];
$k5= $all['Name5'];
$k6= $all['Name6'];
$arr[]= $k1;
$total_values = array_count_values($arr);
foreach ($total_values as $key => $value)
echo $key .'-'. $value .'<br>';
我的输出结果是:
鲍勃-3 亚历克斯-1 伊万-1 尼娜-2
当我将代码更改为:
<?php
$q= mysqli_query($db, 'SELECT * FROM names');
while ($all = mysqli_fetch_array($q))
$k1= $all['Name1'];
$k2= $all['Name2'];
$k3= $all['Name3'];
$k4= $all['Name4'];
$k5= $all['Name5'];
$k6= $all['Name6'];
$arr=array($k1, $k2);
$total_values = array_count_values($arr);
foreach ($total_values as $key => $value)
echo $key .'-'. $value .'<br>';
我的输出结果是:
鲍勃-1 亚历克斯-1 伊万-1 尼娜-1 尼娜-1 鲍勃-1 鲍勃-1 伊万-1 尼娜-1 尼娜-1 .......
在数组 $arr 中添加 $k2、$k3....$k6 出了什么问题?
【问题讨论】:
听起来像是crosstab queries 的一个很好的用例。如果您在查询中完成繁重的工作,您将不必使用 PHP 进行大量操作。 【参考方案1】:这将计算单个名称的出现次数:
$q= mysqli_query($db, 'SELECT * FROM names');
$arr = array();
// 1) loop through rows
while ($all = mysqli_fetch_array($q, MYSQLI_NUM))
// 2) loop through cells in a row
foreach($all as $val)
// 3) 'roll out' the values into a one-dimensional array
if(empty($val)) continue; // if you don't want to count empty cells
$arr[] = $val;
// 4) count the number of occurences
$names_qty = array_count_values($arr);
// optional loop that shows the results
foreach($names_qty as $name=>$qty)
echo $name.'-'.$qty.'<br />';
此解决方案的好处是您只调用一次计数函数,而不是在每次迭代中。
【讨论】:
为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及这样做的原因,不仅适用于 OP,而且适用于可能会发现此问题并正在阅读您的答案的 SO 的未来访问者。 代码将名字的数字加倍(名字之后)! @BorislavRazvanski 感谢您发现这一点!这是因为mysqli_fetch_array
同时返回了数字键和字符串键,因此每行中的单元格数量增加了一倍。向该函数添加第二个参数后,一切正常。
是的,现在可以工作了!但是在你在函数中添加第二个参数之前,我使用 mysqli_fetch_assoc 而不是 mysqli_fetch_array 并且它工作正常!非常感谢!
@BorislavRazvanski 太好了,不客气。它将与这两个功能一起使用。如果我的回答对您有帮助,请考虑接受。谢谢:)。【参考方案2】:
你必须循环累积数据,待所有数据处理完毕后再打印。
$total = array();
$result = mysqli_query($db, 'SELECT * FROM names', MYSQLI_USE_RESULT);
while (mysqli_fetch_assoc($result) as $row)
foreach ($row as $col => $value)
total[$col]++;
print_r($total);
【讨论】:
【参考方案3】:这段代码已经过测试,应该可以解决问题。
<?php
$arr = array();
$q = mysqli_query($db, 'SELECT * FROM names');
while ($all = mysqli_fetch_assoc($q))
foreach($all as $val)
if(empty($val))
continue;
// saves all names with the name as key
$arr[$val][] = $val;
// Output
foreach($arr as $k => $v)
// count how many times the name was pushed into the array
echo $k.' - '. count($v);
【讨论】:
为什么 OP 应该“试试这个”? 尤其是你承认它未经测试!好的答案总是会解释做了什么以及为什么这样做,不仅是为了 OP,也是为了未来可能会发现此问题并正在阅读您的答案的 SO 访问者。 问题出在哪里?是的,它已经过测试。 它可以工作,但是代码使名称的数字加倍(在名称之后)! 为了防止名称出现双数,我将 mysqli_fetch_array 更改为 mysqli_fetch_assoc 并且代码运行完美!我更新了你的帖子! 我已经更新了我的答案。当你投票赞成这个答案时会很棒。 ;)以上是关于PHP计算在许多列中包含相同值的MYSQL行的主要内容,如果未能解决你的问题,请参考以下文章