PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : array_search bei dreidimensionalen Arrays



phoen][x
24-07-2002, 09:12
Hey ho.

Ich hab hier ein kleines Problem mit array_search(). Erst einmal mein array:



$newtimes = array(
array(4342,0,0,0,0,0),
array(5445,0,0,0,0,0),
.
.
.
array(2344,0,0,0,0,0));


Ich moechte jetzt wissen in welchem array die 5445 vorkommt - "array_search(5445,$newtimes)" liefert jedoch nichts passendes (ist ja auch klar, da so nur arrays gefunden werden). "array_search(5445,$newtimes[$x])" mit einer "for($x=0;$x<sizeof($newtimes);$x++) {}" einzuseten ist zwar moeglich, aber nicht sehr performant.

Faellt jemandem etwas anderes ein?

-phoen][x-

joey.brunner
24-07-2002, 15:18
Hi,

spontan fallen mir da zwei dinge ein (da mein gehirn aber von einem marathonmeeting geradezu vernichtet u total zerbröselt wurde, kann es auch sein, dass ich das nicht gescheit herüberbringe oder einfach schwachsinn labere)

Da - wie du ja bereits erwähnt hast - Schleifen sehr performacnefeindlich sind, würde ich - wenn du nciht zuviele arrays verwendest - die funktion



in_array

verwenden, da diese sehr performancefreundlich ist

du könntest dies folgendermaßen realsisieren



$array1 ="...";

$wert = "5445";
if(in_array($wert, $array1)):
.
.
.
//bei meheren arrays kannst du auch switch() verwenden
// da die funktion den Wert true zurückgibt, wenn der $wert in $array gefunden wurde, ist es ein leichtes zu überprüfen, wo der Wert steckt


Möglichkeit 2:
du verwendest die funktion


array_walk()


dazu musst du dir eine funktion baseln, die die suche gestaltet, diese übergibst du dann der funktion
ungefähr so:



function finden($element)
{
.
.
.}

.
.
.
array_walk($wert, "finden");


ich hoffe das hat dir gehoflen, leider kann ich es zurzeit nicht testen, da ich zu müde bin ;)

sorry
joey

phoen][x
25-07-2002, 06:10
Zuerst einmal der Aufbau meiner Arraystruktur in plain php:


$newArray = array(array(13414,1,2,3),
array(44321,1,2,3),
array(54325,1,4,3),
array(77652,4,3,1),
array(99531,2,5,6));


Der Loesungsansatz, den du in deiner ersten Loesung verwewndet hast, ist trivial fuer dieses Problem. Mit deiner Loesung kann ich Arrays mit zwei Dimensionen durchsuchen, jedoch nicht eines mit dreien. Beispiel:



echo (int)in_array(44321,$newArray);


Bei dieser Anweisung wird immer 0 ausgegeben, da in $newArray lediglich Arrays enthalten sind jedoch keine integer - und somit auch niemals die 44321 auftreten koennte. Verstaendlich? Falls nicht, frag einfach nochmal. :)

Der zweite Loesungsansatz durchlaeuft das Array mit array_walk(). array_walk arbeitet intern sicherlich auch mit einer Schleife, ausserdem wuerde mein Funktion dann sizeof($newArray) mal aufgerufen werden - das kann nicht sehr performant sein.

Aber mir ist jetzt in diesem Moment die Loesung eingefallen. Ich modifiziere die Array-Initialisierung folgendermassen:


$newArray = array(13414 => array(13414,1,2,3),
44321 => array(44321,1,2,3),
54325 => array(54325,1,4,3),
77652 => array(77652,4,3,1),
99531 => array(99531,2,5,6));


nun benutze ich beispielsweise



array_search(77652,array_keys($newArray));


um das entsprechende subarray zu ermitteln. Zu bloed, dass ich nicht gestern gleich auf die idee mit den keys gekommen bin.

Oder hat vielleicht irgendjemand noch einen anderen Vorschlag zur Loesung des Problems?

-phoen][x-

Stage
27-07-2002, 11:07
Um effektiv zu suchen würde ich vorschlagen ein HashTabelle extra zu bilden.

Aber bevor ich hier anfange etwas dazu zu schreiben, noch ein paar Fragen.

Wo ist denn in deinem Problem das 3-Dimensionale Array? das $new_array ist doch nur 2-dimensional.
Und für die Erstellung eines Hash bräuchte man bei der Arrayerstellung, die Koordinaten der jeweiligen Werte.
Wenn die Array so statisch wie in deinem Beispiel, spricht fest im Code, und nicht eventuell über 3 for-schleifen, dann kann man das mit dem Hash vergessen.