2014-02-25 17 views
1

嵌套陣列我有這種格式文件到PHP

-Main 
--Sub 
--Next sub 
---Sub Sub 
--Last sub 
-Next Main 
-Last Main 
--Sub 
--Next sub 

一個txt文件,我需要將其轉換爲嵌套數組

Array(
"Main" => array("Sub","Next sub" => array("Sub Sub")), 
); 

是否有任何遞歸函數來做到這一點在PHP? 非常感謝

+0

的語言是什麼? – Leo

+0

我編輯了帖子..在PHP – user3347718

+0

這將幫助你:-)謝謝 – Leo

回答

0

也許不是很漂亮,但代碼的作品。

$str = " 
-Main 
--Sub level 2 
--Next sub level 2 
---Sub Sub1 level 3 
---Sub Sub2 level 3 
--Last sub level 2 
-Next Main 
-Last Main 
--Sub level 2 
--Next sub level 2 
--Next sub level 2 
--Next sub level 2 
---Next sub1 level 3 
---Next sub2 level 3 
---Next sub3 level 3 
--Next sub level 2 
-Next sub 
--Next sub level 2 
--Next sub level 2 
"; 
$a = explode("\n", $str); 
$last_count = 1; 
$level = array(); 
$level1 = array(); 
$level2 = array(); 
$level3 = array(); 
$max_level = 0; 
$min_level = 1; 

foreach($a as $key => $val) 
{ 
$count = substr_count($val, '-'); 
if ($max_level < $count) 
{ 
$max_level = $count; 
} 
} 

foreach($a as $key => $val) 
{ 
$count = substr_count($val, '-'); 
$val = trim($val, '-'); 
if ($count > 0) 
{ 
if ($count == $min_level) 
{ 
$level1[] = $level2; 
if ($last_count == 2) 
{ 
$level1[] = $val; 
} 

$level1[] = $level2; 
$level2 = array(); 
$level1[] = $val; 
} 
elseif ($count == ($max_level - 1) && ($last_count >= $min_level)) 
{ 
if ($last_count == $max_level) 
{ 
array_pop($level2); 
$level2[$name2] = $level3; 
$level3 = array(); 
} 

$level2[] = $val; 
$name2 = $val; 
} 
elseif ($count == $max_level && ($last_count >= ($min_level + 1))) 
{ 
$level3[] = $val; 
} 

$last_count = $count; 
} 
} 

$level1[] = $level2; 
$level1 = array_filter($level1); 
$arr = array(); 

foreach($level1 as $key) 
{ 
$arr[$var] = is_array($key) ? $key : ''; 
$var = $key; 
} 

$arr = array_filter($arr); 
echo '<pre>'; 
print_r($arr); 
echo '</pre>'; 

結果:

Array 
(
    [Main] => Array 
     (
      [0] => Sub level 2 
      [Next sub level 2] => Array 
       (
        [0] => Sub Sub1 level 3 
        [1] => Sub Sub2 level 3 
       ) 

      [1] => Last sub level 2 
     ) 

    [Last Main] => Array 
     (
      [0] => Sub level 2 
      [1] => Next sub level 2 
      [2] => Next sub level 2 
      [Next sub level 2 ] => Array 
       (
        [0] => Next sub1 level 3 
        [1] => Next sub2 level 3 
        [2] => Next sub3 level 3 
       ) 

      [3] => Next sub level 2 
     ) 

    [Next sub] => Array 
     (
      [0] => Next sub level 2 
      [1] => Next sub level 2 
     ) 

) 
0

我想簡單地爆炸文件內容將做的工作,以便讓你開始:

$file = fopen('path/to/file.txt', "r"); 
$array = explode('/r',$file); 

這是基本的,但在這裏,你可以將其處理成嵌套數組。

+0

你可能想仔細檢查[fopen()]返回的內容(http://us3.php.net/manual/en/ function.fopen.php) –

+0

是的,這不是問題。但接下來呢? – user3347718