2015-05-21 17 views

Trả lời

5

Đây là một loại chỉ làm thay đổi mảng ban đầu thay vì tạo một biến mới sử dụng array_walk:

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

Nếu $a trống, điều này chỉ nên để lại nó như là trống rỗng . Tuy nhiên, nó cho rằng mảng đầu vào của bạn có các khóa bắt đầu từ 0.

+0

Điều này thật hoàn hảo! Trong khi tôi không yêu cầu thay đổi tại chỗ, đây có vẻ là phiên bản nhỏ gọn nhất mà tôi thực sự đang tìm kiếm. –

+0

@DeadManWalker, thực sự đây không phải là phiên bản nhỏ gọn nhất. Đây là một lỗi chính tả của hàm đầu tiên từ [answer] (http://stackoverflow.com/a/30365085/2266855): 'function mn ($ a) {return count ($ a) <2? $ a: [array_shift ($ a) => mn ($ a)]; } '. Ngoài ra chức năng của tôi là hiệu quả hơn. – dened

23

Đây là một thực thể:

<?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"))); 

Nếu bạn không thích đệ quy, đây là một phiên bản lặp đi lặp lại:

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

Tôi sẽ sử dụng a for -lớp cho điều này :)

$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

Điều này dường như đang hoạt động.

$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

OP muốn mảng trong cùng của chúng trông giống như 'mảng (" be "=> array (" lồng nhau "))', mã của bạn trả về 'Array ([được] => lồng nhau) '. Tôi nghĩ rằng một mảng trống sẽ có ý nghĩa hơn, bằng cách này: '[" be "=> [" lồng nhau "=> []]]'. – Kobi

+0

@Kobi note cố định –

17

Sử dụng array_reduce:

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

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

Lưu ý rằng chúng tôi đang sử dụng array_reverse bởi vì không có một trái giảm là.

dụ làm việc: http://ideone.com/N61VtE

Các vấn đề liên quan