2015-05-21 19 views

Antwort

5

Hier ist eine, die das ursprüngliche Array ändert nur, anstatt eine neue Variable zu schaffen, mit array_walk:

$a = ["I", "need", "this", "to", "be", "nested"]; 
array_walk(array_reverse($a), function ($v, $k) use (&$a) { 
    $a = $k ? [$v => $a] : [$v]; 
}); 

Wenn $a leer ist, soll dies lass es einfach so leer . Es nimmt jedoch an, dass Ihr Eingabearray Schlüssel hat, die mit 0 beginnen.

+0

Das ist perfekt! Obwohl ich nicht nach einer Änderung am Platz fragte, scheint dies die kompakteste Version zu sein, nach der ich wirklich gesucht habe. –

+0

@DeadManWalker, eigentlich ist dies nicht die kompakteste Version. Hier ist eine Schreibweise der ersten Funktion aus [meine Antwort] (http://stackoverflow.com/a/30365085/2266855): 'Funktion mn ($ a) {Rückkehr Anzahl ($ a) <2? $ a: [array_shift ($ a) => mn ($ a)]; } '. Auch meine Funktion ist effizienter. – dened

23

Hier ist eine mögliche Implementierung:

<?php 

function make_nested($array) { 
    if (count($array) < 2) 
     return $array; 
    $key = array_shift($array); 
    return array($key => make_nested($array)); 
} 

print_r(make_nested(array("I", "need", "this", "to", "be", "nested"))); 

Wenn Sie die Rekursion nicht mögen, ist hier eine iterative Version:

function make_nested($array) { 
    if (!$array) 
     return array(); 
    $result = array(array_pop($array)); 
    while ($array) 
     $result = array(array_pop($array) => $result); 
    return $result; 
} 
4

Ich würde verwenden a for -loop für diese :)

$array = array("I", "need", "this", "to", "be", "nested"); 

$newArray[$array[count($array)-2]] = array_pop($array); 

for($i = count($array) - 2; $i > -1; $i--) { 
    $newArray[$array[$i]] = $newArray; 
    unset($newArray[$array[$i+1]]); 
} 

print_r($newArray); 
1

Dies scheint zu funktionieren.

$a = array("I", "need", "this", "this", "to", "be", "nested"); 
$r = array($a[sizeof($a) - 1]); 
for ($i=sizeof($a)-2; $i >= 0; $i--) { 
    $r = array($a[$i] => $r); 
} 
echo($ar == $r); 
3

Run The Code

<?php 

    // nested_array(array, start_index, length) 
    function nested_array($arr, $i, $size) 
    { 
     if ($i == ($size-1)) 
     { 
      return array($arr[$i] => array()); 
     } 
     return array($arr[$i] => nested_array($arr,($i+1),$size)); 
    } 

    print_r(nested_array(array("I", "need", "this", "to", "be", "nested"),0,6)); 

?> 
+4

Die OP wollte, dass ihr innerstes Array wie folgt aussieht: array ("be" => array ("nested")) ', Ihr Code gibt' Array ([sei] => verschachtelt) '. Ich denke, ein leeres Array würde übrigens mehr Sinn ergeben: '[" be "=> [" nested "=> []]]'. – Kobi

+0

@Kobi Hinweis behoben –

17

Mit array_reduce:

$a = ["I", "need", "this", "to", "be", "nested"]; 

$result = array_reduce(array_reverse($a), function($prevArray, $key){ 
    return $prevArray ? [$key => $prevArray] : [$key]; 
}, null); 

Bitte beachte, dass wir array_reverse verwenden, weil es nicht einem linken reduzieren ist.

Arbeitsbeispiel: http://ideone.com/N61VtE

Verwandte Themen