Geschachteltes Array durchlaufen und ausgeben

Kalito

Erfahrenes Mitglied
Hallo,

ich habe folgendes Array:
Code:
array(
	(int) 13 => array(
		'name' => 'A',
		'childs' => array(
			(int) 14 => array(
				'name' => 'B',
				'childs' => array(
					(int) 15 => array(
						'name' => 'aa',
						'childs' => array()
					),
					(int) 11 => array(
						'name' => 'bb',
						'childs' => array()
					)
				)
			)
		)
	),
	(int) 10 => array(
		'name' => 'ZZ',
		'childs' => array(
			(int) 12 => array(
				'name' => '3',
				'childs' => array()
			)
		)
	)
)

Dabei ist zu beachten, dass die Tiefe nicht bekannt ist, ich also nicht weiß, wieviele Kinder es gibt. Nun möchte ich dieses Array ausgeben (mittels geschachtelten Accordions). Jedoch weiß ich nicht, wie ich mittels php und html dies umsetzen können. Meine Vermutung ist, dass ich eine recursive Funktion einsetzen muss. Geht das auch anders?

Danke und Gruß, Kalito
 
Nee, musste schon rekursiv machen ;)

Google mal "array rekursiv ausgeben" oder entsprechenden englischen Varianten.
 
Es geht auch iterativ:

PHP:
<?php

$a = array(
    (int) 13 => array(
        'name' => 'A',
        'childs' => array(
            (int) 14 => array(
                'name' => 'B',
                'childs' => array(
                    (int) 15 => array(
                        'name' => 'aa',
                        'childs' => array()
                    ),
                    (int) 11 => array(
                        'name' => 'bb',
                        'childs' => array()
                    )
                )
            )
        )
    ),
    (int) 10 => array(
        'name' => 'ZZ',
        'childs' => array(
            (int) 12 => array(
                'name' => '3',
                'childs' => array()
            )
        )
    )
);

$stack = array();
reset($a);
$stack[] = &$a;

$run = true;

while ($run) {
    $active = &$stack[count($stack) - 1];

    $key   = key($active);
    $value = current($active);

    if ($key !== null) {
        printf(
            "%s%s => %s\n",
            str_repeat('  ', count($stack) - 1),
            $key,
            $value['name']
        );
    }

    next($active);

    if (count($value['childs']) > 0) {
        reset($value['childs']);
        $stack[] = &$value['childs'];
    } else {
        if (current($active) === false) {
            array_pop($stack);

            if (count($stack) === 0) {
                $run = false;
            }
        }
    }
}

// 13 => A
//   14 => B
//     15 => aa
//     11 => bb
// 10 => ZZ
//   12 => 3

Das ist allerdings etwas hacky. Ich habe nicht die maximale Konzentration investiert.

Die Idee ist es, die „aktiven“ Ebenen auf einen Stack zu schreiben. Das dürfte dasselbe sein, was rekursive Funktionen auch intern machen.

PS: Die (int)-„Operatoren“ würde ich weglassen, die ergeben keinen Sinn.
 
Zuletzt bearbeitet:
Zurück