0

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'];、コメントアウトされている場合、期待される結果が得られますが、コメントアウトするとエラーが発生します:

注意: 未定義のオフセット

その行にコメントしないと、未定義のオフセット エラーは発生しませんが、私の値はばかげています。

正しい値:Array ( [22] => 19 [32] => 11 )
その行がコメントアウトされていない値:Array ( [32] => 43 [22] => 41 )

それらの値に到達する数学的な方法さえ理解できず、正しい方向に導くことができるものを見つけることができないため、困惑しています。

4

2 に答える 2

1

エントリを 0 に初期化するだけです:

while($row = $result->fetch(PDO::FETCH_ASSOC)) {
    if(!isset($sumArr[ $row['utilizator'] ])) $sumArr[ $row['utilizator'] ] = 0;
    $sumArr[ $row['utilizator'] ] += $row['cantitate'];
}

if 行は配列に$row['utilizator']エントリを作成し、その値を 0 に初期化します。$sumArr

あなたが抱えていた問題は、私が思う文字列で初期化したことです:

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

IMO$row['meniu_name']は文字列です。次に、文字列に加算を行うと、PHP はこの文字列を整数に変換する傾向があり、お気付きの奇妙な結果が得られます。

于 2013-11-14T08:11:25.023 に答える
0

最初に SQL を学ぶ必要があります。以下のリストが示すように、これらすべてを 1 つのクエリで実行できます。これは、すべてのデータをドラッグして処理するよりも単純で効率的です

SELECT nume, prenume, email, telefon, utilizator, sum(cantitate) 
FROM comenzi, utilizatori WHERE id = utilizator GROUP BY utilizator
于 2013-11-14T08:39:25.687 に答える