webentwicklung-frage-antwort-db.com.de

Summe der Werte 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 schon ein paar Stunden versucht, das herauszufinden. Ich dachte, dass array_sum() funktionieren würde, aber nicht mit einem mehrdimensionalen Array. Also habe ich versucht herauszufinden, wie man den f_counts durch unset() oder durch Spleißen oder irgendetwas anderes isoliert, aber jede Lösung scheint eine foreach-Schleife zu beinhalten. Ich habe mit array_map, array_walk und anderen verfahren, ohne Erfolg. Ich habe keine Funktion gefunden, die mit mehrdimensionalen Arrays gut funktioniert.

Ich führe PHP 5.4 aus.

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

Wenn dies hilfreich ist, sind die f_count-Werte niemals höher als 100 und die uid-Werte sind immer größer als 100.


Wenn es eine Möglichkeit gibt, meine Abfrage anders auszuführen, so dass das Array nicht mehrdimensional ist, könnte dies natürlich auch funktionieren.

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

Ich benutze PDO.

21
David

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

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

Natürlich führt dies intern eine Doppelschleife aus. Es ist nur so, dass Sie es nicht im Code sehen. Sie können array_reduce() verwenden, um eine Schleife zu entfernen:

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 verwendeten Variablen, d. H. Es werden keine Funktionsaufrufe zur Berechnung der Endsumme verwendet.

56
Ja͢ck

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

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

für diese Art von Situation ist foreach loop die beste Option, aber wenn Sie dies mehrmals auf einer einzigen Seite tun müssen, sollten Sie foreach loop in eine Funktion einfügen, damit Ihr Code sauber bleibt

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

Bearbeiten

Nach der Suche fand ich heraus, dass die array_column-Funktion in PHP 5.5 vorhanden ist, um alle Werte einer einzelnen Spalte als Array zu erhalten.

Für Benutzer mit niedrigerer Version Sie können die folgende Funktion verwenden und sie mit der Arraysumme aufrufen, wenn Sie auch die Summe aller Werte wünschen.

//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 abrufen möchten, rufen Sie die Funktion oben wie folgt auf:

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

Wenn Sie die Summe aller Werte einer einzelnen Spalte wünschen, verwenden Sie folgenden Code:

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

Alternativ, wenn es eine Möglichkeit gibt, meine Abfrage anders auszuführen als Das Array ist nicht multidimensional, das würde 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, Ihre Abfrage anders auszuführen. Sie können die Aggregatfunktion SUM verwenden, um die Summe aller f_count direkt in Ihrer Abfrage abzurufen. Sie würden dies mit $stmt->fetchColumn() kombinieren, um den Wert der ersten Spalte (die Summe) der ersten Zeile (die einzige Zeile ist, seit wir eine Aggregatfunktion verwendet haben) zu erhalten.

Hier ist ein Beispiel, wie Sie dies tun können:

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

Da Sie PHP 5.4 mit PDO verwenden, kann es einen weiteren Weg geben (verfügbar in PHP 5.1+):

  • verwenden Sie die PDO fetchAll()-Funktion mit dem PDO::FETCH_COLUMN als fetch_style und der 0-indizierten Spaltennummer als fetch_argument.

Nach 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 Funktion array_sum, um die Werte des Arrays zu summieren:

$fcount_sum = array_sum($array_fcount);

Sie können auch die Dokumentation zu PHP unter http://php.net/manual/de/pdostatement.fetchall.php einsehen.

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

0
kpk