tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
281
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    prinzschleifer prinzschleifer ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    98
    Hallo Community,

    ich bin gerade eine Funktion zu schreiben, die ein multidimensionales Array runterwandern soll.

    Mein Array:
    PHP-Code:
    $testarray[] = array( 'name' => 'LOL''subcat' => array( 'name' => 'LOL2''subcat' => '')); 
    So, nun möchte ich eine 'subcat' auf ein normales array (nicht multidimensional) bringen.

    Also habe ich folgeden Funktion geschrieben:
    PHP-Code:
    function digdown($array) {     
                  if(
    is_array($array)) {
                     foreach(
    $array as $key1 => $value1) {
                         
    $test[] = array('name' => $value1['name'], 'num' => $value1['num'], 'sub' => );
                         
    digdown($value1['subcat']);
                         
                     }
                     return 
    $test;
                 }     
             } 
    Und sie wird hier aufgerufen:
    PHP-Code:
    $test digdown($testarray); 
    Es wir aber lediglich der erste Werte eingetragen, also nur eine Rekursion durchgeführt. Dann bleibts stehen. Was mach ich falsch?

    Danke!
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das Problem ist, das du das Rückgabe-Array innerhalb der Funktion überhaupt nicht verwendest. Da müßtest du die 2 Arrays zusammenhängen.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    prinzschleifer prinzschleifer ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    98
    So?
    PHP-Code:
    function digdown($array) {     
                  if(
    is_array($array)) {
                     foreach(
    $array as $key1 => $value1) {
                         
    $test[] = array('name' => $value1['name'], 'num' => $value1['num'], 'sub' => );
                        
    $test[] = digdown($value1['subcat']);
                         
                     }
                     return 
    $test;
                 }     
             } 

    Dann bekomm ich das hier:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    Array
    (
        [0] => Array
            (
                [name] => LOL
                [num] => 
                [sub] => 1
            )
     
        [1] => Array
            (
                [0] => Array
                    (
                        [name] => L
                        [num] => L
                        [sub] => 1
                    )
     
                [1] => 
                [2] => Array
                    (
                        [name] => 
                        [num] => 
                        [sub] => 1
                    )
     
                [3] => 
            )
     
    )

    Sieht komisch aus :P
    Wie müsste ich die Funktion abändern?
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    So wie du es jetzt machst, fügst du ja wieder ein Array als Element in das Array ein. Du müßtest die Arrays aneinanderhängen.

    Schau mal hier: http://www.faqts.com/knowledge_base/view.phtml/aid/343

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Ork6 Ork6 ist offline Grünschnabel
    Registriert seit
    Jan 2007
    Beiträge
    3
    Hi!

    So funktioniert es, zumindest bei dem Beispielarray:

    PHP-Code:
    <?php
            $testarray
    [] = array( 'name' => 'LOL''subcat' => array( 'name' => 'LOL2''subcat' => ''));
            
            function 
    digdown($array) {     
                  if(
    is_array($array)) {
                     foreach(
    $array as $key1 => $value1) {
                        
                         
    $test[] = array('name' => $value1['name'], 'num' => $value1['num'], 'sub' => );

                        if (
    is_array($value1['subcat'])){
                            
    $quark $value1['subcat'];
                             
    $test[] = array('name' => $quark['name'], 'num' => $quark['num'], 'sub' => );
                        }
                     }
                     return 
    $test;
                     
                 }
       
             }  
            
    $test digdown($testarray);
            
            
    print_r ($test);
        
    ?>
    Grüße
    Uwe
     

  6. #6
    prinzschleifer prinzschleifer ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    98
    Vielen, vielen dank!

    Trotzdem,
    dass Ding ist ja nicht rekursiv gelöst, sprich es geht zwei Arrays runter und dann ist Schluss.

    Mein Testarray hat sich übrigens geändert, wäre nett wenn da jemand mal einen blick drüber werfen könnte:
    PHP-Code:
    */                    $testarray[] = array( 'bla' => 'bla''subcat' => array(array('name' => 'Name9''subcat' => '')));                     
                         
    $testarray[] = array( 'name' => 'Nam1''subcat' => 
                                                                     array( 
                                                                             array(
    'name' => 'Nam1''subcat' => 
                                                                                     array(
                                                                                             array(
    'name' => 'Nam2''subcat' => array() 
                                                                                          ),
                                                                          
                                                                             array(
    'name' => 'Nam3''subcat' => array()))))); 
    Wie man sehen kann: Ich will beliebig tief gehen können!

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    Array
    (
        [0] => Array
            (
                [bla] => bla
                [subcat] => Array
                    (
                        [0] => Array
                            (
                                [name] => Name9
                                [subcat] => 
                            )
     
                    )
     
            )
     
        [1] => Array
            (
                [name] => Nam1
                [subcat] => Array
                    (
                        [0] => Array
                            (
                                [name] => Nam1
                                [subcat] => Array
                                    (
                                        [0] => Array
                                            (
                                                [name] => Nam2
                                                [subcat] => Array
                                                    (
                                                    )
     
                                            )
     
                                        [1] => Array
                                            (
                                                [name] => Nam3
                                                [subcat] => Array
                                                    (
                                                    )
     
                                            )
     
                                    )
     
                            )
     
                    )
     
            )
     
    )
    Geändert von prinzschleifer (08.02.09 um 01:13 Uhr)
     

  7. #7
    DeluXe DeluXe ist offline Funkjoker
    Registriert seit
    Jul 2004
    Ort
    Offenburg
    Beiträge
    847
    Zwar nicht gerade schön, aber funktionell.
    PHP-Code:
    $testarray[] = array( 
        
    'name' => 'Nam',
        
    'subcat' => array(
            
    'name' => 'Nam1',
            
    'subcat' => array(
                
    'name' => 'Nam2',
                
    'subcat' => array()
            ), 
        ),
        array(
            
    'name' => 'Nam3',
            
    'subcat' => array()
        )
    );

    function 
    digdown$array$list = array() ) {
        if( !
    is_array$array ) ) return false;
        
        foreach( 
    $array as $k => $value ) {
            if ( !
    is_array$value ) || empty( $value ) ) continue;
            
            
    $list[] = array( 'name' => $value['name'], 'num' => $k );

            if ( 
    is_array$value['subcat'] ) ) {
                
    $list digdown$value$list );
            }
        }
        return 
    $list;

    Mehr ist beim ersten Kaffee eben noch nicht drinne.
     

  8. #8
    Registriert seit
    Mar 2004
    Beiträge
    1.856
    Blog-Einträge
    2
    Zitat Zitat von prinzschleifer Beitrag anzeigen
    So, nun möchte ich eine 'subcat' auf ein normales array (nicht multidimensional) bringen.
    Das rekursiv zu lösen ginge ganz einfach, indem du den Ausgabewert als zweites Argument referentiell mitgibst und das Ursprungsarray selbstverständlich rekursiv aufbaust. Die Funktion soll dazu nur einen Return Wert haben, wenn sie kein zweites Argument hat, also muss dieses nur noch optional sein und fertig is der Schuh:

    PHP-Code:
    function array_flat($arr, &$return NULL)
    {
      foreach (
    $arr as $val)
      {
        if (
    $val["name"])
        {
          
    $return[] = array(
            
    "name" => $val["name"]
          );
        }
        if(
    is_array($val["subcat"]))
        {
          
    array_flat($val$return);
        }
      }
      if (!
    $return)
      {
        return 
    $return;
      }

    So oder so ähnlich. Vor dem ersten Kaffee ist mehr nicht drin. Hoffe der Sinn ist klar geworden. Vorher noch auf Fehler prüfen, hab gerade nichts zum Parsen. Und ich blick noch nich ganz bei deinem Testarray durch, vor allem weil dazu die gewünschte Ausgabe fehlt. Sonst wär es garkein Problem das sauber umzusetzen.

    Noch zwe eventuell hilfreiche Funktionen:
    http://de.php.net/manual/de/function.array-reduce.php
    http://de.php.net/manual/de/function.array-map.php
    Geändert von ZodiacXP (08.02.09 um 13:05 Uhr)
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  9. #9
    prinzschleifer prinzschleifer ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    98
    Hi,

    ich hatte leider noch keine Zeit an dem Algorithmus weiterzuarbeiten, aber ich kann euch ja mal das Zielarray geben, dann wird die Sache doch recht einfach.

    Ursprungsarray:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    
    Array
    (
        [0] => Array
            (
                [name] => bla
                [subcat] => Array
                    (
                        [0] => Array
                            (
                                [name] => Name9
                                [subcat] => 
                            )
     
                    )
     
            )
     
        [1] => Array
            (
                [name] => Nam1
                [subcat] => Array
                    (
                        [0] => Array
                            (
                                [name] => Nam1
                                [subcat] => Array
                                    (
                                        [0] => Array
                                            (
                                                [name] => Nam2
                                                [subcat] => Array
                                                    (
                                                    )
     
                                            )
     
                                        [1] => Array
                                            (
                                                [name] => Nam3
                                                [subcat] => Array
                                                    (
                                                    )
     
                                            )
     
                                    )
     
                            )
     
                    )
     
            )
     
    )

    Zielarray
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Array 
    ( 
    [0] => bla
    [1] => Nam9
    [2] => Nam1
    [3] => Nam1
    [4] => Nam2
    [5] => Nam3
    )


    Das Skript soll einfach den Namen jeder Subkategorie finden und in ein Array packen.
    Geändert von prinzschleifer (08.02.09 um 17:41 Uhr)
     

  10. #10
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    Willst du jetzt Hilfe oder etwas erledigt haben?

    Es wurden mehrere Lösungsvorschläge gepostet, wenn es dich zuviel Zeit kostet(und du nichtmal den Anstand besitzt) dir diese anzusehen, dann wende dich mit deinem Problem vielleicht besser an die Jobbörse
     

  11. #11
    prinzschleifer prinzschleifer ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    98
    Danke hat geklappt!
     

Ähnliche Themen

  1. Problem bei Rekursion
    Von DarkPhoenixX im Forum Java
    Antworten: 6
    Letzter Beitrag: 07.02.08, 07:44
  2. Problem mit der Rekursion!
    Von safin23 im Forum Java
    Antworten: 0
    Letzter Beitrag: 02.12.07, 15:44
  3. Problem mit Rekursion
    Von splat im Forum PHP
    Antworten: 5
    Letzter Beitrag: 21.01.07, 02:25
  4. Dickes Problem mit Rekursion
    Von chickenwings im Forum PHP
    Antworten: 4
    Letzter Beitrag: 20.07.06, 16:12
  5. Problem mit Rekursion und FindNextFile
    Von Tutankhseth im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 18.08.04, 21:26