Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 求和数组值,其中的键是相同的_Php_Mysql_Arrays - Fatal编程技术网

Php 求和数组值,其中的键是相同的

Php 求和数组值,其中的键是相同的,php,mysql,arrays,Php,Mysql,Arrays,我从MySQL中提取了一些数据,然后我试图对结果数组中键相同的值求和。我以前在这段代码中做得很好: $q = "SELECT * FROM comenzi"; $result = $odb->query($q); $sumArr = array(); while($row = $result->fetch(PDO::FETCH_ASSOC)) { if ( !isset($sumArr[ $row['meniu

我从MySQL中提取了一些数据,然后我试图对结果数组中键相同的值求和。我以前在这段代码中做得很好:

$q = "SELECT * FROM comenzi";
        $result = $odb->query($q);

        $sumArr = array();
        while($row = $result->fetch(PDO::FETCH_ASSOC)) {
            if ( !isset($sumArr[ $row['meniu_name'] ]) ) {
                $sumArr[ $row['meniu_name'] ] = $row['meniu_name'];
            }
            $sumArr[ $row['meniu_name'] ] += $row['cantitate'];
        }
        arsort($sumArr);
        $rowCount = 1;
        echo "<table><tr id='tableHeader'><td>#</td><td>produs</td><td>cantitate</td></tr>";
        foreach ($sumArr as $key => $value) {
            echo "<tr><td>" . $rowCount . "</td><td>" . $key . "</td><td>" . $value . "</td></tr>";
            $rowCount++;
        }
        echo "</table>";
这是我的工作示例,它将我们带到下一个类似的示例,但由于某些原因,它没有产生所需的结果:

$q = "SELECT * FROM comenzi";
        $result = $odb->query($q);

        $sumArr = array();
        while($row = $result->fetch(PDO::FETCH_ASSOC)) {
            if ( !isset($sumArr[ $row['utilizator'] ]) ) {
                // $sumArr[ $row['utilizator'] ] = $row['utilizator'];
            }
            $sumArr[ $row['utilizator'] ] += $row['cantitate'];
        }
        arsort($sumArr);
        print_r($sumArr);
        $rowCount = 1;
        echo "<table><tr id='tableHeader'><td>#</td><td>utilizator</td><td>cantitate produse</td></tr>";
        foreach ($sumArr as $k => $v) {

            $odb                =           new PDO("mysql:host=".$host.";dbname=".$db, $user, $pass);

            $stmtCheck  =       $odb->prepare('SELECT nume, prenume, email, telefon FROM utilizatori WHERE id=?');
            $stmtCheck->execute(array($k));
            $r = $stmtCheck->fetch();


            echo "<tr><td>" . $rowCount . "</td><td>" . "<b>nume: </b>" . $r[0] . "<b> prenume: </b>" . $r[1] . "<b> email: </b>" . $r[2] . "<b> telefon: </b>" . $r[3] . "</td><td>" . $v . "</td></tr>";
            $rowCount++;
        }
        echo "</table>";
这里发生的事情非常可疑:注释行//$sumArr[$row['utilizator']]=$row['utilizator'];,如果它被注释掉了,我会得到预期的结果,但是如果它被注释掉了,我会得到错误:

注意:未定义的偏移量

如果我不注释该行,我不会得到未定义的偏移量错误,但我的值是荒谬的

正确值:数组[22]=>19[32]=>11 未注释掉该行的值:数组[32]=>43[22]=>41


我甚至无法理解获取这些值的数学方法,也找不到任何可以让我找到正确方向的东西,因此我感到困惑。

您只需将条目初始化为0:

while($row = $result->fetch(PDO::FETCH_ASSOC)) {
    if(!isset($sumArr[ $row['utilizator'] ])) $sumArr[ $row['utilizator'] ] = 0;
    $sumArr[ $row['utilizator'] ] += $row['cantitate'];
}
if行将在$sumArr数组中创建$row['utilizator']条目,并将其值初始化为0

您遇到的问题是,您使用字符串初始化了它,我认为:

$sumArr[ $row['meniu_name'] ] = $row['meniu_name'];

IMO$row['meniu_name']是一个字符串。然后,当您对字符串进行加法运算时,PHP倾向于将该字符串转换为整数,这会给您带来奇怪的结果。

您需要先学习SQL:如下面的清单所示,您可以在一个查询中完成所有这一切,这比尝试向下拖动所有数据然后处理它更简单、更高效

SELECT nume, prenume, email, telefon, utilizator, sum(cantitate) 
FROM comenzi, utilizatori WHERE id = utilizator GROUP BY utilizator

你就不能用array_sum$yourray?嗯,让我很快调查一下。谢谢你的提示!仔细研究:array_sum对数组中的所有值求和,我需要对它们求和,具体到键。这就是为什么我使用arsort$sumArr;为什么不使用mysql对相同的产品求和?看看GROUP BY吧,它将为您节省大量代码@伊菲:我为你在这里的一个答案上所感受到的尖锐语气道歉。评论已经被删掉了——不要让它妨碍你提问或回答问题。在这个网站上有一些人,尽管他们有技术诀窍,但我最好还是忽略他们。谢谢你,伙计。非常感谢!如果你能给我指出正确的方向,让我了解为什么会这样,我会喜欢很久的。