2011-12-16 49 views
7

Tôi có chuỗi:String với cấu trúc mảng Mảng

Main.Sub.SubOfSub 

Và một số loại dữ liệu, có thể là một chuỗi:

SuperData 

Làm thế nào tôi có thể chuyển đổi tất cả để mảng này ở trên không?

Array 
(
[Main] => Array 
    (
     [Sub] => Array 
      (
       [SubOfSub] => SuperData 
      ) 

    ) 

)

Nhờ sự giúp đỡ, PK

+0

$ tmp_array = phát nổ ('.', $ Your_string); Sau đó, lặp qua $ tmp_array và tạo mảng $ k của bạn – djot

+0

Hãy xem http://php.net/manual/en/function.explode.php và http://php.net/manual/en/function.implode .php và bạn gần như ở nhà. – Cyclonecode

+0

Câu hỏi tương tự, chỉ dành cho đối tượng 'stdClass', không phải mảng: [Array to object] (http://stackoverflow.com/q/11188563/367456). – hakre

Trả lời

11

Với giá trị

$key = "Main.Sub.SubOfSub"; 
$target = array(); 
$value = "SuperData"; 

Dưới đây là một số mã tôi đã nằm xung quanh mà những gì bạn need¹:

$path = explode('.', $key); 
$root = &$target; 

while(count($path) > 1) { 
    $branch = array_shift($path); 
    if (!isset($root[$branch])) { 
     $root[$branch] = array(); 
    } 

    $root = &$root[$branch]; 
} 

$root[$path[0]] = $value; 

See it in action.

¹ Thực tế nó hơi nhiều hơn thế: nó có thể được đóng gói nhỏ bên trong một hàm và có thể định cấu hình trên cả ba giá trị đầu vào (bạn có thể chuyển vào một mảng với các giá trị hiện tại và nó sẽ mở rộng khi cần thiết) .

4

Giống như Jon đã đề xuất (và đang yêu cầu phản hồi cho trò chuyện), một bí danh tham chiếu/biến hữu ích ở đây để duyệt qua ngăn xếp động. Vì vậy, điều duy nhất cần thiết là lặp qua tất cả các khóa con và cuối cùng đặt giá trị:

$rv = &$target; 
foreach(explode('.', $key) as $pk) 
{ 
    $rv = &$rv[$pk]; 
} 
$rv = $value; 
unset($rv); 

Tham chiếu này có thể sử dụng ngăn xếp thay vì đệ quy thường thô hơn. Ngoài ra, mã này ngăn không ghi đè các phần tử hiện có trong mảng $target. Full dụ:

$key = "Main.Sub.SubOfSub"; 
$target = array('Main' => array('Sub2' => 'Test')); 
$value = "SuperData"; 

$rv = &$target; 
foreach(explode('.', $key) as $pk) 
{ 
    $rv = &$rv[$pk]; 
} 
$rv = $value; 
unset($rv); 

var_dump($target); 

Output:

array(1) { 
    ["Main"]=> 
    array(2) { 
    ["Sub2"]=> 
    string(4) "Test" 
    ["Sub"]=> 
    array(1) { 
     ["SubOfSub"]=> 
     string(9) "SuperData" 
    } 
    } 
} 

Demo

Câu hỏi liên quan (s):

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