dedlfix: array_search rekursiv einsetzen

Beitrag lesen

echo $begrüßung;

Da array_search() ja keine mehrdimensionalen Arrays durchsucht, habe ich einige Beispiele der Benutzer von der Manualseite ausprobiert, um auch mehrdimensionale Array zu durchsuchen, allerdings klemmen sie alle irgendwo..

Was hat dir denn an dem Vorschlag nicht gefallen? Das war von oben gesehen die erste, die einen Selbstaufruf enthielt, was für Rekursion eine essentielle Eigenschaft ist. Darunter folgen auch noch ein paar.

[...] 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.

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.)

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.
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.

echo "$verabschiedung $name";