Problem mit rekursiver Funktion: Array wird nicht zurückgegeben

tequito

Mitglied
Hallo

Wie kann man einen Array den man einer rekursiven Funktion übergibt wieder ausgeben?

Der Array "$structure" sieht so aus:
PHP:
Array
(
  [20] => Array
    (
      [id] => 20
      [name] => Root
      [children] => Array
        (
          [30] => Array
            (
              [id] => 30
              [name] => Primaten
              [children] => Array
                (
                  [18] => Array
                    (
                      [id] => 18
                      [name] => Halbaffen
                      [children] => Array()
                    )
                  [42] => Array
                    (
                      [id] => 42
                      [name] => Affen
                      [children] => Array()
                    )
                )
            )
        )
    )
)

Die Funktion die ich mir geschrieben habe sieht so aus:
PHP:
function rekursiv( $array )
{
  foreach( $array as $key => $value )
  {
    if( is_array($value) )
    {
      if( count( $value['children'] ) > 0 )
      {
        rekursiv( $value['children'] );
      }
      else
      {
        unset( $value['children'] );
      }
    }
  }
  return;
}

rekursiv( $structure );

print_r($structure);



Gedachte hatte ich nun, leere Kinder ("children") zu entfernen und wenn diese nicht leer sind die Funktion noch einmal aufzurufen für die jeweiligen Kinder-Elemente.

Wieso gibt die Funktion $structure unverändert aus? Wo steckt bei dieser rekursiven Funktion der Fehler?
 
Wenn du eine Variable an eine Funktion übergibst, erstellt diese eine Kopie davon.
Die Lösung für dein Problem ist einfach: Nutze eine Referenz.

PHP:
function rekursiv( &$array )
{
  foreach( $array as $key => $value )
  {
    if( is_array($value) )
    {
      if( count( $value['children'] ) > 0 )
      {
        rekursiv( $value['children'] );
      }
      else
      {
        unset( $value['children'] );
      }
    }
  }
  return;
}

rekursiv( $structure );

print_r($structure);
 
Du hast recht... ;)

Habs ein wenig anders gelöst.

PHP:
<pre>
<?php
$arr = array('20' => array(
				'id' => 20,
				'name' => 'Root',
				'children' => 
				array(
					'id' => '30',
					'name' => 'Primaten',
					'children' => array( 
						array(
							'id' => 18,
							'name' => 'Halbaffen',
							'children' => array()
						),
						array(
							'id' => 42,
							'name' => 'Affen',
							'children' => array()
						)
					)
				)
			)
		);

function rekursiv( $array )
{
  foreach( $array as $key => $value )
  {
    if( is_array($value) )
    {
      if( count( $value['children'] ) > 0 )
      {
        rekursiv( $value['children'] );
      }
      unset( $value['children'] );
    }
	$arr[] = $value;
  }
  return $arr;
}
$array = rekursiv( $arr );

print_r($array);

?>
 
Zurück