Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrdemensionales-Array in Eindemensionales-Array umwandeln

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrdemensionales-Array in Eindemensionales-Array umwandeln

    Hallo,

    leider komme ich auch bei einem zweiten Thema nicht weiter - so ist der ist Zustand:
    PHP-Code:
    $test = array(
        
    'abc' => 123,
        
    'def' => 456,
        
    'test' => array(
            
    123 => 'hip',
            
    'hop' => null
        
    )
    ); 
    Ich möchte nun folgenden Zustand erreichen:
    PHP-Code:
    $test = array(
        
    'abc' => 123,
        
    'def' => 456,
        
    'test.123' => 'hip',
        
    'test.hop' => null

    Vorraussetzung ist, das dies in jeglicher Tiefe funktioniert. Mir schwebt nun eine Funktion âla "convertArray" vor welche sich im falle das $value ein Array ist wieder selbst aufruft - also eine Rekrusion. Ich hab schon mit "array_map" und "implode" rumgespielt und bin aber zu keinem Ergebnis gekommen da ich "gehört habe" das man Rekrusionen wenn möglich vermeiden soll.

    Vielen Dank euch!

  • #2
    ... da ich "gehört habe" das man Rekrusionen wenn möglich vermeiden soll.
    ... und wenn nicht, dann nicht.. also nur los.. Versuchs mal mit einem rekursiven Ansatz. Einfach mal hier posten dann können wir gerne drüber diskutieren.

    Kommentar


    • #3
      http://ideone.com/3jPhVb

      Kommentar


      • #4
        Hallo,

        danke für eure Rückmeldungen. Da war tkausl wohl schneller als ich - hatte meine implementierung genauso gemacht wie er nur ohne short-konstrukut bei der "if-schleife" und mit anderen Variablen-Namen.
        Kern meiner Urfrage war - ist eine Rekrusion hier vermeidbar? Wenn ja wie?

        Vielen Dank

        Kommentar


        • #5
          Man soll Rekursion vermeiden, wenn es iterativ leichter ist bzw. nicht schwerer. Es gibt aber Probleme, wo die iterative Version einen zwingt seinen eigenen Stack zu benutzen; in dem Falle natürlich Rekursion benutzen.

          Hier geht es auch iterativ:
          PHP-Code:
          foreach ($test as $old => &$arr) {
              if (
          is_array($arr)) {
                  unset(
          $test[$old]);
                  foreach (
          $arr as $new => $v) {
                      
          $test["$old.$new"] = $v;
                  }
              }

          Diese Variante funktioniert aber gerade nur mit PHP 7 (übrigens, die scheinbar nutzlose Referenz bei $arr im foreach-Kopf ist sehr wichtig... vgl. http://3v4l.org/l05jl), wie man gut hier sieht: http://3v4l.org/T8722

          Eine manuelle Schleife mit list() = each() funktioniert aber immer (http://3v4l.org/851ov):
          PHP-Code:
          while (list($old$arr) = each($test)) {
              if (
          is_array($arr)) {
                  unset(
          $test[$old]);
                  foreach (
          $arr as $new => $v) {
                      
          $test["$old.$new"] = $v;
                  }
              }

          Ich möchte aber hinzufügen, dass die rekursive Version (wie in #3 von tkausl erwähnt) deutlich übersichtlicher ist. Die iterative Version hier mag den Betrachter vielleicht erst etwas wundern tun ;-D

          Kommentar


          • #6
            Vielen Dank für euere Hilfe!
            -> Ist aus Performance-Gründen die Methode von bwoebi vorzuziehen oder sollte diese Rekrusion kein Problem darstellen?

            Kommentar


            • #7
              Ich denke meine Methode ist in dem Fall schneller, da es immer auf dem selben Array arbeitet mit einer minimalen Anzahl an Operationen.
              Zumindest hat Rekursion keinen Vorteil gegenüber der iterativen Variante in diesem Fall...

              Kommentar


              • #8
                Dein Vorhaben klingt so generisch, wäre es nicht vorteilhafter wenn du dir eine eigene Array-Struktur definierst und das Array in diese Struktur bringst, anstatt eine rekursive Passform ungeachtet jeder Regel über eine vorgegebene Struktur stülpst ?

                Kommentar

                Lädt...
                X