Summenwerte eines mehrdimensionalen Arrays nach Schlüssel ohne Schleife

Lesezeit: 5 Minuten

Summenwerte eines mehrdimensionalen Arrays nach Schlussel ohne Schleife
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_counts 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 100und 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.

  • Ohne Schleifen kann man mit einem Array nichts anfangen. Warum sind Sie dem so abgeneigt?

    – verzeihen

    22. April 2013 um 4:14 Uhr

Summenwerte eines mehrdimensionalen Arrays nach Schlussel ohne Schleife
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'));

  • Danke Mann, jetzt kann ich gut schlafen. Meine Version soll nicht summieren, sondern nur zählen, also verwende ich diese Funktion => $value = array_count_values(array_column($arr,'f_count'));

    – Nova Herdi Kusumah

    28. November 2015 um 21:46 Uhr


  • “… mehrdimensionales Array …” was ist mit einem Fall, in dem die Tiefe beispielsweise ist 3?

    – Fr0zenFyr

    7. Juli 2017 um 10:05 Uhr

  • Super, danke Freund.

    – Sanjeev Shetty

    9. Mai 2021 um 10:01 Uhr

1646643851 997 Summenwerte eines mehrdimensionalen Arrays nach Schlussel ohne Schleife
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.

  • Ich bin nicht zu anmaßend zu denken, dass diese Optionen wahrscheinlich effizienter sind als foreach?

    – David

    22. April 2013 um 2:31 Uhr

  • @ David Nein, sie sind beide weniger effizient als foreach.

    – Jack

    22. April 2013 um 2:51 Uhr

  • Ich war wohl falsch informiert. Danke für das Aufklären.

    – David

    22. April 2013 um 18:29 Uhr

  • Ich würde dir einen Bonus geben, wenn ich könnte, wenn du auch auf einen kommst foreach das ist hübscher und einfacher als die anderen, die ich gesehen habe. Danke noch einmal.

    – David

    22. April 2013 um 19:36 Uhr

1646643852 185 Summenwerte eines mehrdimensionalen Arrays nach Schlussel ohne Schleife
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_styleund 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.

964630cookie-checkSummenwerte eines mehrdimensionalen Arrays nach Schlüssel ohne Schleife

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy