n-dimensionale Arrays summieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
all
anhieb
antwort
array
code
dank
ehrgeiz
ergebnis
ersten beispiel
fassen
fehler
funktion
legen
parameter
posten
schlauch
strang
summe
trivialen fehler
verarbeitung
-
Ich hab die Suche hier im Forum schon bemüht, da es aber soviele Ergebnisse zu Array summieren gab, nehmts mir bitte nicht übel wenn ich das übersehen haben sollte.
Also folgendes Problem ich möchte n-dimensionale Arrays summieren und steh gerade auf dem schlauch
Dieser Code funktioniert nur bei normalen Arrays
function arrays_sum() { $arg_list = func_get_args(); $return = array(); if(is_array($arg_list)) { foreach($arg_list as $key=>$value) { if(is_array($value)) { foreach($value as $kkey=>$vvalue) { $return[$kkey] += $vvalue; } } } return (array) $return; } return false; }
wenn ich nun aber sobeschaffene Arrays addieren will kommt logischerweise ein Fehler:
$q = array('a' => 5, 'b' => array('a' => 4, 'q' => array('j' => 5))); $qs = array('a' => 2, 'b' => array('c' => 10, 'q' => array('b' => 5))); print_r(arrays_sum($q, $qs));
Ich steh nur gerade auf dem Schlauch, an welcher stelle ich die Funktion nochmal sich selbst aufrufen lassen muss, dass dann wirklich das summierte Array herauskommt.
Im Manual habe ich nachgeschaut aber es scheint keine Funktion dafür zu geben.
Vielen Dank im Vorraus für Hinweise
lg -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Also ich habe selbst noch nicht viel mit Arrays in PHP gearbeitet, aber du hast schon im ersten Beispiel einen trivialen Fehler. Dieser Code funktioniert nämlich nur bis zur 2. Ebene. Falls es mehr gibt, werden die Werte einfach ignoriert. Auch die Werte der 1. Ebene werden ignoriet, denn wenn $value kein Array, sondern bereits einen Wert enthält, wird dieser nie verwendet. Da würde ich einfach nochmal nen While drüber legen, mit nem entsprechenden Cancel-Ausdruck. $key und $value würde ich dann nochmal als Array anlegen, dass als Identifier die Ebene enthält. Diese kannst du dann anschließend mit nem for summieren und hast dann wirklich alle Werte addiert.
Für die n-dimensionalen Arrays, würde ich dann noch ne Funktion vorschalten, die zuerst die innere Summe ermittelt und dann als Wert in der While-Schleife zurückgibt.
Liebe Grüße
- VampireSilence
Beitrag zuletzt geändert: 1.5.2009 15:25:28 von vampiresilence -
Hi,
ich verstehe jetzt nicht genau was du willst, bzw. was das bringen soll.
Möchtest du wenn du 2 Arrays hast immer Array1['x'] + Array2['x'] rechnen oder was?
Wenn du das willst, würde ich das so machen:
function arrays_sum($Array1, $Array2) { $return = array(); if((!(is_array($Array1))) || (!(is_array($Array2)))) { echo "FEHLER, in arrays_sum, Parameter sind keine Arrays!"; return 0; } foreach($Array1 as $key=>$value) { if(is_array($value)) { if (!(is_array($Array2[$key])) { $Array2 [$key] = array() } $return [$key] = arrays_sum($Array1[$key], $Array2[$key]); } $return = $Array1[$key] + Array2[$key]; } return (array) $return; } return false; }
MfG
Steffen
Beitrag zuletzt geändert: 1.5.2009 17:09:47 von fusballmanager -
vampiresilence schrieb:
...aber du hast schon im ersten Beispiel einen trivialen Fehler...
Dies ist mir bewusst, ich hatte es schon versucht die Funktion nocheinmal auszuführen, aber iwie bin ich gerade nicht in der Lage das logisch zu fassen (zu starke Kopfschmerzen).
Dein Ansatz klingt erstmal gut, ich gestehe aber, dass ich mich mit while noch nie beschäftigt habe und deswegen jetzt nicht auf Anhieb verstanden habe, wie ich das genau umsetzte. Ich werd mich da ab Dienstag mal hinterklemmen und falls ich es geschafft habe das Ergebnis hier posten.
Für den Fall dass jemand bereits diese fertige Funktion hat, wäre ich ihm sehr verbunden, wenn er mir diese hier posten könnte.
@fussballmanager Danke für deine Antwort, jedoch ist dein Code mit meinem geposteten im Ergebnis identisch
vampiresilence schrieb:
...Dieser Code funktioniert nämlich nur bis zur 2. Ebene. Falls es mehr gibt, werden die Werte einfach ignoriert...
Muchas Gratias -
zenks schrieb:
@fussballmanager Danke für deine Antwort, jedoch ist dein Code mit meinem geposteten im Ergebnis identisch
vampiresilence schrieb:
...Dieser Code funktioniert nämlich nur bis zur 2. Ebene. Falls es mehr gibt, werden die Werte einfach ignoriert...
Muchas Gratias
Meiner funktioniert nicht nur bis zur 2. Ebene, da die Funktion sich selber aufruft!
Aber der nachteil ist, das Elemente die nur im 2. Array sind nicht übernommen werden!
Dieser Code:
function arrays_sum($Array1, $Array2) { $return = array(); if((!(is_array($Array1))) || (!(is_array($Array2)))) { echo "FEHLER, in arrays_sum, Parameter sind keine Arrays!"; return 0; } foreach($Array1 as $key=>$value) { if(is_array($value)) { if (!(is_array($Array2[$key]))) { $Array2 [$key] = array(); } $return [$key] = arrays_sum($Array1[$key], $Array2[$key]); } $return[$key] = $Array1[$key] + $Array2[$key]; } return $return; } $q = array('a' => 5, 'b' => array('a' => 4, 'q' => array('j' => 5))); $qs = array('a' => 2, 'b' => array('c' => 10, 'q' => array('b' => 5))); print_r(arrays_sum($q, $qs));
Erzeugt folgende Ausgabe:
Array ( [a] => 7 [b] => Array ( [a] => 4 [q] => Array ( [j] => 5 ) [c] => 10 ) )
MfG
Steffen -
Wozu brauchst Du ein so derb verschachteltes Array? Das geht mit Sicherheit auch um Längen einfacher. Was willst Du denn genau erreichen und vorallem von wo bekommst Du die Daten?
-
Wenn ich das richtig verstanden habe, möchtest du alle Unterarrays zusammenaddieren. Dann würde ich dafür eine rekursive Funktion basteln.
<?php function sum_multi_array ( $array ) { if( is_array( $array ) ) { foreach ( $array as $val ) $summe += sum_multi_array( $val ); return $summe; } else { return $array; } } ?>
Beitrag zuletzt geändert: 2.5.2009 3:31:54 von fly-europe -
@fussballmanager Vielen Dank, ich hatte beim ersten Versuch mit deinem Code wohl irgendwas falsch gemacht ;). Ich hab ihn etwas überarbeitet und jetzt funktioniert es.. Vielen Dank dass du mich drauf gestoßen hast.
@strange Es geht um die Verarbeitung von Logfiles, aber ich habe gerade vorhin eine erheblich einfachere Methode gefunden ;). War jetzt nur noch der Ehrgeiz, nachdem ich das nun gefragt hatte auch zu einem Ergebnis zu kommen, was mir dank fussballmanager ja gelungen ist, nicht dass Ihr euch umsonst bemüht hättet, abgesehen davon interessiert vlt noch mehr so eine Funktion, bzw. ich bin noch ni ganz fertig mit dem Projekt evtl. brauch ich die Funktion noch, sicherlich nicht als n-dimensional, aber naja "be prepaired" ne.
@fly-europe Vielen Dank für diese Funktion, es ist eine angepasste Version von array_sum auf Multidimensionale Array, kann ich sicherlich auch gebrauchen.
@all Der fertige Code:
function arrays_sum() { $return = array(); $arg_list = func_get_args(); if(count($arg_list) == 1 && is_array($arg_list[0])) { $arg_list = $arg_list[0]; } foreach($arg_list as $count=>$array) { if(!is_array($array)) { echo "FEHLER, in arrays_sum, Parameter sind keine Arrays!"; return false; } foreach($array as $key=>$value) { if(is_array($value)) { if(!is_array($return[$key])) { $return[$key] = array(); } $return[$key] = arrays_sum($value, $return[$key]); } $return[$key] += $value; } } return $return; }
Ein Beispiel dazu:
$q = array('a' => 5, 'b' => array('a' => 4, 'q' => array('j' => 5))); $qs = array('a' => 2, 'b' => array('c' => 10, 'q' => array('b' => 5))); $qst = array('c' => 2, 'b' => array('c' => 4, 'q' => array('b' => 4, 'j' => 10))); print_r(arrays_sum($q, $qs, $qst));
ergibt:
Array ( [a] => 7 [b] => Array ( [c] => 14 [q] => Array ( [j] => 15 [b] => 9 ) [a] => 4 ) [c] => 2 )
Super vielen Dank an alle, die mir geholfen haben, bzw. es versucht haben :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage