Summenwerte eines mehrdimensionalen Arrays nach Schlüssel ohne Schleife

Ich habe das:

Array ( [0] => Array ( [f_count] => 1 [uid] => 105 ) [1] => Array ( [f_count] => 0 [uid] => 106 ) [2] => Array ( [f_count] => 2 [uid] => 107 ) [3] => Array ( [f_count] => 0 [uid] => 108 ) [4] => Array ( [f_count] => 1 [uid] => 109 ) [5] => Array ( [f_count] => 0 [uid] => 110 ) [6] => Array ( [f_count] => 3 [uid] => 111 ) ) 

Was ich brauche ist: 7 “, das ist die Summe der f_count Spalte.

Ich habe versucht, das für ein paar Stunden herauszufinden. Ich dachte array_sum() würde funktionieren, aber nicht mit einem mehrdimensionalen Array. Also habe ich versucht, herauszufinden, wie man die f_count s durch unset() oder Splicing oder irgendetwas anderes isoliert, aber jede Lösung scheint eine foreach Schleife zu beinhalten. Ich habe mit array_map , array_walk und anderen array_walk versucht. Ich habe keine function gefunden, die gut mit mehrdimensionalen Arrays funktioniert.

Ich benutze PHP 5.4.

Kann mir bitte jemand zeigen, wie man diese Spalte ohne eine foreach Schleife summiert?

Wenn es hilft, werden die f_count Werte nie höher als 100 , und die uid Werte werden immer größer als 100 .


Alternativ, wenn es eine Möglichkeit gibt, meine Abfrage anders auszuführen, so dass das Array nicht mehrdimensional ist, würde das natürlich auch funktionieren.

 $query = "SELECT f_count, uid FROM users WHERE gid=:gid"; ... $array = $stmt->fetchAll(); 

Ich benutze PDO.

   

Sie müssen es mit array_map() , um zuerst die Spalte f_count auszuwählen:

 array_sum(array_map(function($item) { return $item['f_count']; }, $arr)); 

Natürlich führt dies intern eine doppelte Schleife durch; Es ist nur so, dass Sie es nicht innerhalb des Codes sehen. Sie könnten array_reduce() , um eine Schleife loszuwerden:

 array_reduce($arr, function(&$res, $item) { return $res + $item['f_count']; }, 0); 

Wenn jedoch die Geschwindigkeit das einzige Interesse ist, bleibt foreach am schnellsten:

 $sum = 0; foreach ($arr as $item) { $sum += $item['f_count']; } 

Dies liegt an der “Lokalität” der von Ihnen verwendeten Variablen, dh es werden keine functionsaufrufe zur Berechnung der endgültigen Summe verwendet.

In PHP 5.5+ können Sie array_column und array_sum so verwenden:

  $value = array_sum(array_column($arr,'f_count')); 

Alternativ, wenn es eine Möglichkeit gibt, meine Abfrage anders auszuführen, so dass das Array nicht mehrdimensional ist, würde das natürlich auch funktionieren.

 $query = "SELECT f_count, uid FROM users WHERE gid=:gid"; ... $array = $stmt->fetchAll(); 

Ich benutze PDO.

Ja, es gibt eine andere Möglichkeit, die Abfrage anders auszuführen. Sie könnten die Aggregatfunktion SUM , um die Summe aller f_count direkt in Ihrer Abfrage f_count . Sie würden dies mit $stmt->fetchColumn() kombinieren, um den Wert der ersten Spalte (die die Summe wäre) der ersten Zeile zu erhalten (was die einzige Zeile ist, seit wir eine Aggregatfunktion verwendet haben).

Hier ist ein Beispiel, wie Sie das tun könnten:

 $query = "SELECT SUM(f_count) FROM users WHERE gid=:gid"; $stmt = $pdo->prepare($query); $stmt->execute(array(':gid' => 'yoursearchvalue')); $sum = $stmt->fetchColumn(); 

Für diese Art von Situation foreach Schleife ist die bestmögliche Option, aber wenn Sie dies für mehrere Male auf einer einzigen Seite tun müssen, dann sollten Sie foreach Schleife in einer function, so dass Ihr Code sauber bleiben

 function sum_index($arr, $col_name){ $sum = 0; foreach ($arr as $item) { $sum += $item[$col_name]; } return $sum; } 

Bearbeiten

Nach der Suche habe ich festgestellt, dass array_column function in PHP 5.5 + existieren, um alle Werte einer einzelnen Spalte als Array zu erhalten.

Für Benutzer mit einer niedrigeren Version Sie können die folgende function verwenden und sie mit der Array-Summe aufrufen, wenn Sie auch die Summe aller Werte erhalten möchten.

 //to get all values of single column from multidimensional array, this function exist in php 5.5 or greater. if(!function_exists("array_column")) { function array_column($array,$column_name) { return array_map(function($element) use($column_name){return $element[$column_name];}, $array); } } 

Wenn Sie alle Werte einer einzelnen Spalte erhalten möchten, rufen Sie die obige function auf:

 $newArray = array_column($array,$column_name); 

Wenn Sie die Summe aller Werte einer einzelnen Spalte benötigen, verwenden Sie den folgenden Code:

 $newArraySum = array_sum(array_column($array,$column_name)); 

Da Sie PHP 5.4 mit PDO verwenden, könnte es noch eine andere Möglichkeit geben (verfügbar in PHP 5.1+):

  • Verwenden Sie die PDO-function fetchAll() mit dem PDO::FETCH_COLUMN als fetch_style und die 0-indizierte Spaltennummer als fetch_argument .

Gemäß Ihrem Beispiel könnte es sein:

 $query = "SELECT f_count, uid FROM users WHERE gid=:gid"; ... $array_fcount = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); 

Verwenden Sie nun die function array_sum , um die Werte des Arrays zu summieren:

 $fcount_sum = array_sum($array_fcount); 

Sie können auch die PHP-Dokumentation unter http://php.net/manual/en/pdostatement.fetchall.php konsultieren

Hoffe, das hilft, und die performance könnte besser sein als Schleifen! Wie bereits in anderen Antworten erwähnt, haben Sie ab PHP 5.5 die function array_column() , um $array_fcount direkt von einem anderen Array zu erhalten.