
David
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
Säule.
Ich versuche das seit ein paar Stunden herauszufinden. ich dachte array_sum()
würde funktionieren, aber nicht mit einem mehrdimensionalen Array. Also habe ich versucht herauszufinden, wie ich das isolieren kann f_count
s durch unset()
oder Spleißen oder irgendetwas anderes, aber jede Lösung scheint a zu beinhalten foreach
Schleife. Ich habe mit rumgespielt array_map
, array_walk
, und andere vergebens. Ich habe keine Funktion gefunden, die gut mit mehrdimensionalen Arrays funktioniert.
Ich verwende PHP 5.4.
Kann mir bitte jemand zeigen, wie man diese Spalte ohne a summiert? foreach
Schleife?
Wenn es hilft, die f_count
Werte werden niemals höher sein als 100
und das uid
Werte sind immer größer als 100
.
Wenn es alternativ eine Möglichkeit gibt, meine Abfrage anders auszuführen, sodass 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 verwende PDO.

Anthony Harley
In PHP 5.5+ können Sie einfach verwendet werden array_column
und array_sum
so:
$value = array_sum(array_column($arr,'f_count'));

Jack
Sie müssen es mit koppeln array_map()
die auszuwählen f_count
erste Spalte:
array_sum(array_map(function($item) {
return $item['f_count'];
}, $arr));
Intern führt dies natürlich eine doppelte Schleife aus; Es ist nur so, dass Sie es nicht im Code sehen. Du könntest benutzen array_reduce()
Um eine Schleife loszuwerden:
array_reduce($arr, function(&$res, $item) {
return $res + $item['f_count'];
}, 0);
Wenn Geschwindigkeit jedoch das einzige Interesse ist, foreach
bleibt am schnellsten:
$sum = 0;
foreach ($arr as $item) {
$sum += $item['f_count'];
}
Dies ist der “Lokalität” der verwendeten Variablen zu verdanken, dh es werden keine Funktionsaufrufe zur Berechnung der Endsumme verwendet.

Raja Imran Qamer
Für diese Art von Situation ist die Foreach-Schleife die bestmögliche Option, aber wenn Sie dies mehrmals auf einer einzelnen Seite tun müssen, sollten Sie die Foreach-Schleife 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 langem Suchen habe ich das gefunden array_column
Funktion gibt es in PHP 5.5 +, um alle Werte einer einzelnen Spalte als Array zu erhalten.
Für Benutzer mit einer niedrigeren Version können Sie die folgende Funktion verwenden und sie mit Array-Summe 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 obige Funktion wie folgt auf:
$newArray = array_column($array,$column_name);
Wenn Sie die Summe aller Werte einer einzelnen Spalte wünschen, verwenden Sie den folgenden Code:
$newArraySum = array_sum(array_column($array,$column_name));
Wenn es alternativ eine Möglichkeit gibt, meine Abfrage anders auszuführen, sodass 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 verwende PDO.
Ja, es gibt eine andere Möglichkeit, Ihre Abfrage anders auszuführen. Sie könnten die Aggregatfunktion verwenden SUM
um die Summe aller zu erhalten f_count
direkt in Ihrer Anfrage. Sie würden dies mit kombinieren $stmt->fetchColumn()
um den Wert der ersten Spalte (die die Summe wäre) der ersten Zeile (die die einzige Zeile sein wird, da wir eine Aggregatfunktion verwendet haben) zu erhalten.
Hier ist ein Beispiel, wie Sie dies 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();
Da Sie PHP 5.4 mit PDO verwenden, könnte es eine weitere Möglichkeit geben (verfügbar in PHP 5.1+):
- Verwenden Sie die PDO
fetchAll()
Funktion mit der PDO::FETCH_COLUMN
als die fetch_style
und die 0-indizierte Spaltennummer als fetch_argument
.
Nach deinem Beispiel könnte es lauten:
$query = "SELECT f_count, uid FROM users WHERE gid=:gid";
...
$array_fcount = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
Verwenden Sie jetzt die array_sum
Funktion zum Summieren der Werte des Arrays:
$fcount_sum = array_sum($array_fcount);
Sie können auch die PHP-Dokumentation unter konsultieren http://php.net/manual/en/pdostatement.fetchall.php
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 array_column()
Funktion zu bekommen $array_fcount
direkt von einem anderen Array.
9646300cookie-checkSummenwerte eines mehrdimensionalen Arrays nach Schlüssel ohne Schleifeyes
Ohne Schleifen kann man mit einem Array nichts anfangen. Warum sind Sie dem so abgeneigt?
– verzeihen
♦
22. April 2013 um 4:14 Uhr