2010-11-19 5 views
5

Mögliche Duplizieren:
How to Flatten a Multidimensional Array?Vereinfachen eine verschachtelte Array in einem einzigen Level-Array

Sagen wir, ich habe ein Array wie folgt aus:

array (
    1 => 
    array (
    2 => 
    array (
     16 => 
     array (
     18 => 
     array (
     ), 
    ), 
     17 => 
     array (
    ), 
    ), 
), 
    14 => 
    array (
    15 => 
    array (
    ), 
), 
) 

Wie würde ich mich über die Transformation in Array wie folgt?

array(1,2,16,18,17,14,15); 
+0

Verwenden Sie var_export oder geben Sie uns das ursprüngliche Array. –

+0

@Elzo Valugi: Ich habe meine Frage aktualisiert. –

+1

@Gordon: Es ist nicht genau dasselbe. Im OPs-Fall sind die Werte tatsächlich die * Schlüssel *. –

Antwort

2

Sorry für die closevote. Habe nicht richtig darauf geachtet, dass du die Schlüssel willst. Lösung unter:

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($arr), 
    RecursiveIteratorIterator::SELF_FIRST); 

$keys = array(); 

und dann entweder

$keys = array(); 
foreach($iterator as $key => $val) { 
    $keys[] = $key; 
} 

oder mit der Iterator-Instanz direkt

$keys = array(); 
for($iterator->rewind(); $iterator->valid(); $iterator->next()) { 
    $keys[] = $iterator->key(); 
} 

oder komplizierter als nötig

iterator_apply($iterator, function(Iterator $iterator) use (&$keys) { 
    $keys[] = $iterator->key(); 
    return TRUE; 
}, array($iterator)); 

gibt

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 16 
    [3] => 18 
    [4] => 17 
    [5] => 14 
    [6] => 15 
) 
0

Wenn wir das verschachtelte Array als Baumstruktur betrachten, können Sie Tiefen Traversal anwenden es in eine Liste zu konvertieren. Das heißt, in ein einzelnes Array, das Sie wünschen.

2

wie wäre es mit Rekursion

$result = array(); 
function walkthrough($arr){ 
$keys = array_keys($arr); 
array_push($result, $keys); 
foreach ($keys as $key) 
{ 
    if (is_array($arr[$key])) 
     walkthrough($arr[$key]); 
    else 
     array_push($result,$arr[$key]); 
} 
return $result; 
} 

walkthrouth ($ your_arr);

P.S.:Code können abgehört werden, aber du hast eine Idee :)

0

ich alle ähnliche Fragen gesucht haben und es scheint, gibt es keine Möglichkeit, ohne Rekursion ist, dass die Schlüssel bestellen intakt halten würde.

Also ging ich nur mit klassischen Rekursion:

function getArrayKeysRecursive(array $theArray) 
{ 
    $aArrayKeys = array(); 
    foreach ($theArray as $k=>$v) { 
     if (is_array($v)) { 
      $aArrayKeys = array_merge($aArrayKeys, array($k), getArrayKeysRecursive($v)); 
     } else { 
      $aArrayKeys = array_merge($aArrayKeys, array($k)); 
     } 
    } 
    return $aArrayKeys; 
} 
1
function flattenArray($array) { 
$arrayValues = array(); 
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $val) { 
    $arrayValues[] = $val; 
} 
return $arrayValues; 
} // function flattenArrayIndexed() 
+0

Das verbirgt nur Rekursion. Aber die Rekursion ist immer noch da. Plus brauche ich Array-Schlüssel, keine Werte. –

Verwandte Themen