2013-04-22 7 views
9

Ich habe dies:Summenwerte von mehrdimensionalen Array nach Schlüsseln ohne Schleife

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 die die Summe der f_count Spalte ist

Ich habe versucht, Ich dachte array_sum() würde funktionieren, aber nicht mit einem mehrdimensionalen Array.So habe ich versucht herauszufinden, wie man die f_count s durch unset() oder Spleißen oder etwas anderes zu isolieren, aber jede Lösung scheint zu beteiligen a foreach Schleife Ich habe mitverwirrt, array_walk und andere vergebens. Ich habe keine Funktion gefunden, die gut mit mehrdimensionalen Arrays funktioniert.

Ich benutze PHP 5.4.

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

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


Alternativ kann, wenn es eine Möglichkeit, meine Abfrage anders, so dass das Array nicht mehrdimensionale laufen soll, das wäre auch offensichtlich arbeiten.

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

Ich benutze PDO.

+0

Sie können nichts mit einem Array ohne Schleifen tun. Warum bist du so abgeneigt? – deceze

Antwort

39

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

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

Natürlich intern, dies eine doppelte Schleife durchführt; Es ist nur so, dass Sie es nicht innerhalb des Codes sehen. Sie array_reduce() verwenden könnte loswerden eine Schleife zu erhalten:

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

jedoch, wenn die Geschwindigkeit das einzige Interesse ist, bleibt foreach die schnellste:

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

Dies ist dank der „Ort“ der Variablen die Sie verwenden, dh es gibt keine Funktionsaufrufe, die zur Berechnung der endgültigen Summe verwendet werden.

+0

Ich bin nicht zu anmaßend zu denken, dass diese Optionen wahrscheinlich effizienter als foreach sein werden? – David

+2

@David Nein, beide sind weniger effizient als 'foreach'. –

+0

Ich denke, ich wurde falsch informiert. Danke für das Aufklären. – David

0

für diese Art von Situation foreach-Schleife ist die beste Option, aber wenn u dies für mehrere Male auf einer einzigen Seite zu tun hat, dann sollte u foreach-Schleife in einer Funktion gesetzt, 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 alot fand ich, dass array_column Funktion gibt es in pHP 5.5 + alle Werte der einzelnen Spalte als Array zu erhalten.

Für Benutzer mit niedrigerer Version Sie können die folgende Funktion verwenden und sie mit Array-Summe aufrufen, wenn Sie auch die Summe aller Werte 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 der einzelnen Spalte erhalten möchten dann so über Funktion aufrufen:

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

Wenn Sie Summe aller Werte der einzelnen Spalte wollen dann folgenden Code verwenden:

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

In pHP 5.5+ Sie nur array_column und array_sum wie so verwendet werden:

+0

Dies ist die beste Performance-Lösung. – Rodrigo

+1

Nur für die Richtigkeit der Dinge sollten die Argumente der array_column vertauscht werden. –

+0

danke Mann, jetzt kann ich gut schlafen. Meine Version ist nicht zu summieren, sondern nur zu zählen, also benutze ich diese Funktion => $ value = array_count_values ​​(array_column ($ arr, 'f_count')); ' –

0

Da Sie PHP 5.4 mit PDO verwenden, könnte es eine weitere Möglichkeit, es zu tun (in PHP 5.1+):

  • verwenden, um die PDO fetchAll() Funktion mit dem PDO::FETCH_COLUMN als fetch_style und die 0-indexierte Spaltennummer als fetch_argument.

Wie pro Ihr Beispiel könnte es sein:

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

nun die array_sum Funktion verwenden, um die Werte des Arrays zusammenzufassen:

$fcount_sum = array_sum($array_fcount); 

Sie könnten auch die PHP-Dokumentation an 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 Funktion array_column(), um $array_fcount direkt von einem anderen Array zu erhalten.

Verwandte Themen