Maik W. aus E.: array_search rekursiv einsetzen

Beitrag lesen

Tach auch dedlfix,

[...] möchte mittels array_search feststellen, ob mein suchbegriff darin vorkommt. Da array_search() ja keine mehrdimensionalen Arrays durchsucht, [...]

Es ist in den meisten PHP-Array-Fällen besser, den Begriff multidimensional zu meiden. Du hast ein Array, das einfache und komplexe Werte aufnehmen. Ein komplexer Wert kann seinerseits wieder einfache und komplexe Werte enthalten. Und das kann beliebig tief geschachtelt werden. Du hast also eine Baumstruktur.

Ja, ich weiß, ich habe bei meiner Archiv-Suche schon einen Beitrag von Dir gefunden, in dem es genau darum ging... Sorry, in meinem OP fehlten da die "Anführungszeichen"...

array_search() sucht nur die einfachen Elemente ab. Und die komplexen? Die müssen wir selbst durchlaufen. Gibt es eine Funktion, die nur alle einfachen oder nur alle komplexen Elemente aus einem Array suchen kann? Damit könnte man array_search() auf die einfachen Elemente loslassen und die komplexen Elemente gesondert behandeln. Eine solche Funktion ist mir noch nicht aufgefallen. Da wir sowieso durch alle Elemente laufen müssen, können wir uns array_search() gleich ganz klemmen und den Vergleich selbst durchführen. (Außerdem, so scheint es mir, willst du gar ncht alle Elemente durchsuchen, sondern nur welche mit einem bestimmten Key (z.B. alle href-Elemente). Dann wäre array_search() sowieso kontraproduktiv.)

Danke für den ausführlichen Hinweis, ich bin immer froh, wenn mir jemand den Hammer wegnimmt, weil man damit nun wirklich nicht sägen kann...

Was muss die Suchfunktion wissen? Das zu durchsuchende Array, den Suchbegriff, evtl. den zu durchsuchenden Key, und wenn ein Treffer gefunden wurde, wolltest du ja noch den Pfad dahin haben. Der lässt sich rückwärts nicht ermitteln, also muss der bisherige Pfad bei jedem hinabzusteigenden Level mitgegeben werden. So sähe eine passende Funktionssignatur aus:

function mwe_search($haystack, $needle, $searchKey = null, $path = '', $sep = '/')

Wie soll das Ergebnis aussehen? Willst du (a) alle Fundstellen, oder (b) nur den ersten Treffer? Für alle Fundstellen brauchst du ein Sammelbecken, z.B. ein Array, das entweder eine Klassenvariable sein kann oder eine globale Variable. Schöner wäre es, wenn die Funktion das Suchergebnis zurücklieferte, aber dafür muss dann auch noch ein Ergebnis-Array mit rumgeschleppt werden.

ich möchte (b) 8>)

Um nur den ersten Treffer zu ermitteln brauchst du eine Erfolgsanzeige, damit der Aufrufer weiß, dass er nun abbrechen kann. Wenn nichts gefunden wurde wäre das ein false, beim einem positiven Ergebnis wäre es der Pfad. Und der muss dann nach außen transportiert werden.

Für alle key-value-Paare im $haystack musst du:

  • prüfen, ob value ein Array ist. In dem Fall muss der Pfad erweitert werden $path .= $sep . '...', und mwe_search() mit dem value als haystack aufgerufen werden. (b) In Abhängigkeit des Rückgabewertes muss die Funktion verlassen werden oder nicht.

  • Wenn kein Array vorliegt:
    -- Wenn $searchkey !== null ist:
    --- Wenn $searchKey gleich $key ist, vergleiche den Wert mit $needle. Bei Übereinstimmung (a) das Sammelarray ergänzen oder (b) Pfad zurückgeben (ggf. ergänzen)
    -- Ansonsten vergleiche den Wert mit $needle, und reagiere gleich wie oben.

Wenn der $haystack durchlaufen ist, muss (a) einfach zurückkehren und (b) ein false zurückliefern.

Super, vielen Dank für diese ausführliche Antwort, ich werde mich umgehend hinsetzen und genau so eine mwe_search-Funktion bauen, das dürfte jetzt ja nicht mehr so schwierig sein...

Danke und

http://www.gruss-aus-essen.de

Maik

--
Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!
Maik. W. aus E. sagt Dankeschön ;-)