Flatten Array

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

  • Flatten Array

    Hi,

    ich habe mir gerade zwei Funktionen geschrieben die folgendes machen.

    Aus
    Code:
    Array
    (
        [kunde] => Array
            (
                [vorname] => ich
                [nachname] => der
            )
    
        [artikel] => Array
            (
                [0] => 12345
                [1] => 43224
                [2] => 23342
                [3] => 33453
            )
    
        [summe] => 214.23
    )
    wird
    Code:
    Array
    (
        [[kunde][vorname]] => ich
        [[kunde][nachname]] => der
        [[artikel][0]] => 12345
        [[artikel][1]] => 43224
        [[artikel][2]] => 23342
        [[artikel][3]] => 33453
        [[summe]] => 214.23
    )
    Ok, ich weiß das es unschön ist die Eckigen Klammern als Keys zu nehmen.

    PHP-Code:
    echo array2getstr('param_input_array'$arr_input); 
    ergibt dann:
    PHP-Code:
    ?param_input_array[kunde][vorname]=ich&param_input_array[kunde][nachname]=der..... 

    Es geht darum mehrdimensionale Arrays in den GetString einer URL zu verpacken. Man könnte es auch mit Serialize machen - da ich aber keine Zugriff auf die empfangende Schnittstelle habe, fällt das aus.

    Hier die Funktionen:
    PHP-Code:
    function flatten_array($arr_input$arr_output = array(), $parent_key ""$child false){
        
        while(
    $data pos($arr_input)){
            
    $key "[".key($arr_input)."]";
                    
            if(
    is_array($data)){
                
    $arr_output flatten_array($data$arr_output$parent_key.$keytrue);
            }else{
                if(
    $child){
                    
    $arr_output[$parent_key.$key] = $data;
                }else{
                    
    $arr_output[$key] = $data;
                }
            }
            
    next($arr_input);
        }
        return 
    $arr_output;
    }



    function 
    array2getstr($str_name$arr_input){
        
    $arr_output flatten_array($arr_input);

        while(
    $data pos($arr_output)){
            
    $key key($arr_output);
            
    $str_output .= $str_name.$key."=".$data;
            if(
    next($arr_output)){
                
    $str_output .="&";
            }
        }

        return 
    $str_output;

    Es funktioniert soweit, auch mit beliebigen "Tiefen" der Arrays. Zwei Fragem hätt ich aber noch:

    1. Wär es möglich das ganze in eine Funktion zu packen? (Wobei mir da grad was einfällt - ich geb ja in flatten_array einen Array zurück - ich könnte ja auch den String dort direkt zusammenbauen.)
    2. Gibt es vielleicht da schon ne Funktion für und ich hab sie nur nicht gefunden?

  • #2
    Noch ne Frage,

    wie gehe ich am geschicktesten damit um, wenn in einem Array ein Wert ist der nicht gefüllt wird und meine Schleife dadurch beendet wird.

    Momentan mache ich das mit arsort()...

    bsp.
    Code:
    Array(
      "foo" => "bar"
      "bar" =>
      "bar2 => "foo"

    Kommentar


    • #3
      So, hab das ganze jetz mal in eine Funktion gedacht - irgendwie hab ich das vor der Mittagspause nicht hinbekommen

      PHP-Code:
      function array2getstr($str_name$arr_input$parent_key ""){

          while(
      $data pos($arr_input)){
              
      $key "[".key($arr_input)."]";
              
              if(
      is_array($data)){
                  
      $str_output .= array2getstr($str_name$data$parent_key.$key);
              }else{
                  
      $str_output .= $str_name.$parent_key.$key."=".$data;
              }
              
              if(
      next($arr_input)){
                  
      $str_output .= "&";
              }
          }
          
          return 
      $str_output;
      }

      //Aufruf:
      array2getstr('name'$input_array); 
      EDIT:
      #1 Hab das $child noch entfernt, das war noch ne altlast

      EDIT:
      #2 Noch nen Fehler korrigert. Beleibiege Dimensionen bei den Arrays möglich
      Zuletzt geändert von prego; 25.08.2005, 13:46.

      Kommentar


      • #4
        Jetz bleibt nur noch die Frage offen, wie ich am besten mit den leeren Feldern in einem Array umgehe.

        Sorry das ich jetz hier soviel Müll mit reingeschrieben habe...

        Kommentar


        • #5
          Kannst du das Array vor der Übergabe an die Funktion säubern ?

          http://faq-php.de/q/q-arrays-loeschen.html

          Kommentar


          • #6
            Japp kann ich.

            Aber leider funktioniert so wie bei der FAQ beschrieben nicht, da ich meine Indexe beibehalten muss.

            For Each kann ich auch nicht nehmen, da ich ja sonst nicht mehr prüfen kann "Müß ich noch ein & anhängen"?
            Was in while mit if(next()) ja geht.

            Kommentar


            • #7
              Hab mir die Funktion jetzt selbst geschrieben, siehe hier:

              http://www.php-resource.de/forum/sho...threadid=58590

              Kommentar


              • #8
                PHP-Code:
                $array = array(
                    
                'kunde' => array(
                        
                'vorname' => 'ich',
                        
                'nachname' => 'der'
                        
                ),
                    
                'artikel' => array(12345432242334233453),
                    
                'summe' => 214.23
                );

                function 
                flatten($array$prefix '') {
                    static 
                $param_count 1;
                    
                $result = array();
                    
                    foreach (
                $array as $key => $value)
                        if (
                is_scalar($value))
                            
                $result[] = 'input_param'.($param_count++).$prefix.'['.$key.']='.$value;
                        else    
                $result array_merge($resultflatten($value$prefix.'['.$key.']'));

                    return (empty(
                $prefix) ? '?' '').implode('&'$result);
                }

                echo 
                flatten($array); 
                würde das auch gehen?
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Wenn ich das so überblicke, sollte es auch gehen.... du mergest eben den array beieinander, ich klebs halt grad an den return string.

                  aber den gedanklichen Ansatz find ich gut.... habs jetzt nicht ausprobiert, weil ich froh bin, das meins läuft.

                  is_scalar ist interessant, aber steigt nicht array_merge sowieso aus, wenn es ein object präsentier kricht?

                  Kommentar

                  Lädt...
                  X