/ / Mehrdimensionale Array-Summenwerte - PHP, Arrays, Rekursion, mehrdimensionale Arrays

Mehrdimensionale Array-Summenwerte - PHP, Arrays, Rekursion, multidimensionales Array

Ich habe folgende Funktion, um mehrdimensionale Array-Werte zu summieren.

// summing values of multidimensional array
function getSum($array, $path = array()){
// process second argument:
foreach ($path as $key) {
if (!is_array($array) || !isset($array[$key])) {
return 0; // key does not exist, return 0
}
$array = $array[$key];
}
if(is_array($array)) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
$sum = 0;
foreach ($iterator as $key => $value) {
$sum += $value;
}
} else{
$sum = $array;
}
return $sum;
}

Ich benutze die Funktion wie folgt:

$array = array();
$array["one"]["green"][20] = 20;
$array["one"]["blue"][20] = 5;
$array["one"]["blue"][30] = 10;

getSum($array,["one","green"]); // 20
getSum($array,["one","blue",20]); // 5

Jetzt habe ich ein Problem, wenn ich zum Beispiel keine bestimmte Farbe festlegen möchte, weil ich möchte, dass das Skript alle Werte der Kategorie 20 aus allen Farben summiert.

Also sollte es so funktionieren:

getSum($array,["one","*",20]); // 25

Danke für Ihre Hilfe!

Hier ist ein Beispiel für mein Array:

Array (
[1] => Array (
[AREA I] => Array (
[20] => 1
[25] => 0
[30] => 0 )
[AREA II] => Array (
[20] => 0
[30] => 0 )
[AREA III] => Array (
[20] => 2
[30] => 0 )
[AREA IV] => Array (
[20] => 0
[30] => 3 )
[AREA V] => Array (
[20] => 4
[25] => 0
[30] => 3 )
)
[2] => Array (
[AREA I] => Array (
[20] => 0
[30] => 0 )
[AREA II] => Array (
[20] => 0
[30] => 0 )
)
)

Und hier ist ein Beispiel von mir getSum Anruf:

getSum($visitsandinfosact,["*","*",20]); // should print 7

Antworten:

1 für die Antwort № 1

Ich war mir nicht sicher, ob ["one","*"] sollte 45 geben, aber wenn es nur 0 zurückgeben sollte, müssen Sie nur die entfernen else if (empty($filterList) && is_array($value) && $first == "*")Bedingung. Alle Werte, die keine Arrays sind, werden einfach in int via konvertiert intval und zur Summe addiert. Wenn Sie float verwenden möchten, verwenden Sie floatval Anstatt von intval

function getSum($array, $filterList = array("*")) {
$sum = 0;
$first = array_shift($filterList);
foreach ($array as $key => $value) {
if ($key == $first || $first == "*") {
if (is_array($value) && !empty($filterList)) {
$sum += getSum($value, $filterList);
} else if (empty($filterList) && is_array($value)) {
$sum += getSum($value, array("*"));
} else if (empty($filterList)) {
$sum += intval($value);
}
}
}
return $sum;
}

echo getSum($array,["one","*",20], 10) . "n"; // 25
echo getSum($array,["one","*","*",20]) . "n"; // 10
echo getSum($array,["one","*"]) . "n"; // 45
echo getSum($array) . "n"; // 45

Eingangsarray

$array = array();
$array["one"] = array();
$array["one"]["green"] = array();
$array["one"]["green"][20] = 20;
$array["one"]["blue"] = array();
$array["one"]["blue"][20] = 5;
$array["one"]["blue"][30] = 10;
$array["one"]["orange"]["red"][20] = 10;

Ausgabe

Es werden nur die Zahlen ausgegeben, aber zum besseren Verständnis nur die Eingabeparameter hinzugefügt.

25 // (["one","*",20])
10 // (["one","*","*",20])
45 // (["one","*"])
45 // no filterList

-1 für die Antwort № 2

Kurz gesagt, Sie benötigen eine rekursive Funktion, um Platzhalter "Endpunkte" hinzuzufügen. Sie können genauso gut dieselbe rekursive Natur verwenden, um auch den Zusatz abzudecken.

Folgendes sollte tun, was Sie wollen:

// summing values of multidimensional array
function getSum(&$array, $path = array()){
$sum = 0;
if(is_int($array) and empty($path)) // return value if int
$sum = $array;
else if(is_array($array)){ // else add recurred values
if(empty($path)){
foreach($array as $value)
$sum += getSum($value);
} else {
$key = array_shift($path);
if($key=="*"){
foreach($array as $value)
$sum += getSum($value, $path);
} else {
if(isset($array[$key]))
$sum += getSum($array[$key], $path);
}
}
}
return $sum;
}

Prüfung:

$array["one"] = array();
$array["one"]["green"] = array();
$array["one"]["green"][20] = 20;
$array["one"]["blue"] = array();
$array["one"]["blue"][20] = 5;
$array["one"]["blue"][30] = 10;
$array["one"]["orange"]["red"][20] = 10;

echo getSum($array,["one","*",20]); // 25
echo getSum($array,["one","*","*",20]); // 10
echo getSum($array,["one","*"]); // 45

Glückliche Kodierung