Ins tiefste multidimensionale assoziative Array ein Array einfügen

NTDY

Erfahrenes Mitglied
Hallo,

ich habe eine Frage.
Ich habe ein multidimensionales assoziatives Array ($aArray) und möchte in das Ende ein Array mit Wert ($aArray2) einfügen.

PHP:
$aArray = array('a' => array('b' => array('c' => array('d' => ''))));
$aArray2 = array('e' => 'f');

Gewünschtes Ergebnis:
PHP:
Array
(
    [a] => Array
        (
            [b] => Array
                (
                    [c] => Array
                        (
                            [d] => Array
                                (
                                    [e] => f
                                )
                        )
                )
        )
)

Mit array_push oder array_merge geht es ja leider nicht. Ich kann sicher über $aArray iterieren, aber vllt. gibt es ja eine fancy-Funktionsaneinanderreihung.

Schöne Grüße und vielen Dank
NTDY
 
Auch eine interessante Aufgabe. Mir fällt da auch nichts anderes ein als zu iterieren und das ginge am besten mit rekursiven Funktionsaufrufen. Es gibt in PHP ja auch Iteratoren, wenn ich mich richtig erinnere auch rekursiv, aber IMO machen die die Sache eher komplizierter als einfacher.
Die Frage ist noch ob das Array wirklich eingleisig aufgebaut ist wie in deinem Beispiel oder ob es auch Verzweigungen geben kann, womöglich mit unterschiedlicher Tiefe:
Code:
$aArray = array('a' => array('b1' => array('c1' => array('d1' => ''))),
                             'b2' => array('c2' => ''));
 
Ist es immer auf jeder Stufe nur ein Array? Wenn es mehrere sein können, an welchen Zweig soll dann angehängt werden?
 
Hallo Yaslaw, es ist immer nur ein Array auf jeder Stufe und es soll immer in die tiefste Ebene angehangen werden.
 
Kommst nicht an einer Funktion vorbei.

Hier 2 Möglichkeiten. Entweder über Referenz oder mit Return Value
PHP:
//referenz
function push_array_multi_byref(&$array, $value){
    $key = array_key_first($array);
    if(is_array($array[$key])){
        push_array_multi_byref($array[$key], $value);
    }else{
        $array[$key] = $value;
    }    
}

//return value
function push_array_multi_byval($array, $value){
    $key = array_key_first($array);
    if(is_array($array[$key])){
        $array[$key] = push_array_multi_byval($array[$key], $value);
    }else{
        $array[$key] = $value;
    }
    return $array;
}


$aArray = array('a' => array('b' => array('c' => array('d' => ''))));
$aArray2 = array('e' => 'f');

$a = push_array_multi_byval($aArray, $aArray2);
push_array_multi_byref($aArray, $aArray2);
    
print_r($a);
print_r($aArray);
 
Hey, kannst du vielleicht kurz erklären, wofür genau du das brauchst? Also welches Problem dein Algorithmus lösen soll...?
Weil ich vermute mal, dass es mit an Sicherheit grenzender Wahrscheinlichkeit eine elegantere Lösung dafür gibt, als bloß willkürlich Arrays ineinander zu verschachteln.

Gruß Technipion
 
Hey, kannst du vielleicht kurz erklären, wofür genau du das brauchst? Also welches Problem dein Algorithmus lösen soll...?
Weil ich vermute mal, dass es mit an Sicherheit grenzender Wahrscheinlichkeit eine elegantere Lösung dafür gibt, als bloß willkürlich Arrays ineinander zu verschachteln.

Gruß Technipion
Jepp.
Ineinander geschachtelte Arrays sind für mich immer das erste Anzeichen einer "Baumstruktur"
 
Ich nehme mal an, bei diesem und dem Thread hier:
Suche Inspiration für HTML-Template / DOMDocument Parsing / Templateerweiterung
handelt es sich um die selbe Aufgabe. In dem anderen Thread hatte ich auch Vorschläge für Alternativen gemacht:
Einfacher wäre es wenn der Analyzer ein Array mit den Schlüsseln zurück geben würde aber wahrscheinlich kannst Du das nicht mehr ohne weiteres ändern wenn anderswo häufig die Stringdarstellung verwendet wird.
und
Möglicher Weise könntest Du auch noch einen Schritt weiter gehen und gleich die Methode findFirstElementInArray('a', $aTemp) so anlegen, dass sie eine Referenz auf das betr. Element zurück gibt.
bzw. gleich die geforderte Aktion, Einhängen des Array, erledigen. Oder ein Callback übergeben, das es erledigt, dann wäre das Ganz flexibler und wiederverwendbar.
Allerdings bin ich mir nicht sicher, ob ich das Vorhaben des TO richtig verstanden habe.
 
Hey, kannst du vielleicht kurz erklären, wofür genau du das brauchst? Also welches Problem dein Algorithmus lösen soll...?
Weil ich vermute mal, dass es mit an Sicherheit grenzender Wahrscheinlichkeit eine elegantere Lösung dafür gibt, als bloß willkürlich Arrays ineinander zu verschachteln.

Gruß Technipion
Hallo Technipion,
vielen Dank für Deine Anfrage. Ich habe eine Template-Engine, die HTML analysiert und dann entsprechend mit Daten rendert, die aus einer Datenbank kommen. Um dieses HTML um Plugins zu erweitern (bspw. ein Bild als Lightbox darstellen) suche ich mit einer Methode nach dem ersten Vorkommen von <a> im Dokument, um dieses um ein Attribut rel="lightbox" zu erweitern.
DerAlgorithmus von Jaslaw erfüllt den entsprechenden Wunsch. Ich bin aber gern für Inspirationen offen.
 
Kommst nicht an einer Funktion vorbei.

Hier 2 Möglichkeiten. Entweder über Referenz oder mit Return Value
PHP:
//referenz
function push_array_multi_byref(&$array, $value){
    $key = array_key_first($array);
    if(is_array($array[$key])){
        push_array_multi_byref($array[$key], $value);
    }else{
        $array[$key] = $value;
    }   
}

//return value
function push_array_multi_byval($array, $value){
    $key = array_key_first($array);
    if(is_array($array[$key])){
        $array[$key] = push_array_multi_byval($array[$key], $value);
    }else{
        $array[$key] = $value;
    }
    return $array;
}


$aArray = array('a' => array('b' => array('c' => array('d' => ''))));
$aArray2 = array('e' => 'f');

$a = push_array_multi_byval($aArray, $aArray2);
push_array_multi_byref($aArray, $aArray2);
   
print_r($a);
print_r($aArray);
Lieber Jaslaw, vielen Dank für die beiden Beispiele. Die funktionieren wunderbar. ))
 
Zurück