2010-11-19 16 views
5

Eventuali duplicati:
How to Flatten a Multidimensional Array?semplificare un array nidificato in un singolo array di livello

Diciamo che ho un array come questo:

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

Come potrei fare su come trasformarlo in array come questo?

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

utilizzare var_export o fornirci l'array originale. –

+0

@Elzo Valugi: ho aggiornato la mia domanda. –

+1

@Gordon: non è esattamente la stessa cosa. Nel caso degli OP, i valori sono in realtà i * tasti *. –

risposta

2

Ci scusiamo per l'closevote. Non ho prestato la dovuta attenzione a te che volevi le chiavi. Soluzione qui di seguito:

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

$keys = array(); 

e poi o

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

o con l'istanza iteratore direttamente

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

o più complicata del necessario

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

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

Se si considera l'array annidato come una struttura ad albero, è possibile applicare la profondità primo attraversamento per convertirlo in un elenco. Cioè, in un singolo array che desideri.

2

come su alcuni ricorsione

$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 può essere spiati, ma tu hai un'idea :)

0

Ho cercato tutte le domande simili e sembra che non v'è alcun modo senza una ricorsione che avrebbe mantenuto le chiavi ordine intatto.

Così ho appena andato con la ricorsione classica:

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

Ciò nasconde semplicemente la ricorsione. Ma la ricorsione è ancora lì. Inoltre ho bisogno di chiavi di array, non di valori. –

Problemi correlati