【问题标题】:PHP counting MYSQL rows that contain the same value in many columnsPHP计算在许多列中包含相同值的MYSQL行
【发布时间】: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 进行大量操作。

标签: php mysql


【解决方案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 并且代码运行完美!我更新了你的帖子!
    • 我已经更新了我的答案。当你投票赞成这个答案时会很棒。 ;)
    猜你喜欢
    • 2014-04-30
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2012-09-27
    相关资源
    最近更新 更多