2012-04-12 100 views
3

比方說,我有這個字符串,我想放在一個多維數組。字符串的多維數組

編輯:字符串中的子文件夾的數量是動態的..從零個文件夾,以10

<?php 
     $string ="Folder1/Folder2/Folder3/filename1\n"; 
     $string .=" Folder1/Folder2/Folder3/filename2\n"; 
     $string .=" Folder4/Folder2/Folder3/filename3\n"; 
?> 

我想下面的數組返回

<?php 
Array 
(
    [Folder1] => Array 
     (
      [Folder2] => Array 
       (
        [Folder3] => Array 
         (
          [0] => filename1 
          [1] => filename2 
         ) 

       ) 

     ) 

    [Folder4] => Array 
     (
      [Folder2] => Array 
       (
        [Folder3] => Array 
         (
          [0] => filename3 
         ) 

       ) 

     ) 

) 
?> 

什麼是最有效的方法完成這個?

爲了它的樂趣讓我們說這個數組將被髮送到世界的另一端,它想要返回到一個字符串。我們將如何做到這一點?

+0

好吧,如果你有一個字符串,你最終要的一個字符串,爲什麼你想一個數組? – 2012-04-12 12:32:16

+0

[String with array structure to Array]可能的重複(http://stackoverflow.com/questions/8537148/string-with-array-structure-to-array) – Jon 2012-04-12 12:41:16

+0

因爲有些人想輸出它作爲數組,想要將它作爲字符串保存在數據庫中。發送兩者都是一種選擇,但效率不高。 – 2012-04-12 12:48:09

回答

8

您可以借用this class的代碼片段,特別是_processContentEntry方法。

這裏的,沒有工作方法的修改版本:

function stringToArray($path) 
{ 
    $separator = '/'; 
    $pos = strpos($path, $separator); 

    if ($pos === false) { 
     return array($path); 
    } 

    $key = substr($path, 0, $pos); 
    $path = substr($path, $pos + 1); 

    $result = array(
     $key => stringToArray($path), 
    ); 

    return $result; 
} 

var_dump(stringToArray('a/b/c/d')); 

輸出將是

array(1) { 
    ["a"]=> 
    array(1) { 
    ["b"]=> 
    array(1) { 
     ["c"]=> 
     array(1) { 
     [0]=> 
     string(1) "d" 
     } 
    } 
    } 
} 

我想這是你所需要的: )


UPDATE

根據您的評論,這裏是你如何處理由新行字符分隔的字符串:

$string = "Folder1/Folder2/Folder3/filename1\n"; 
$string .= " Folder1/Folder2/Folder3/filename2\n"; 
$string .= " Folder4/Folder2/Folder3/filename3\n"; 

// split string into lines 
$lines = explode(PHP_EOL, $string); 

// trim all entries 
$lines = array_map('trim', $lines); 

// remove all empty entries 
$lines = array_filter($lines); 

$output = array(); 

// process each path 
foreach ($lines as $line) { 
    // split each line by/
    $struct = stringToArray($line); 

    // merge new path into the output array 
    $output = array_merge_recursive($output, $struct); 
} 

print_r($output); 

附: 要將此數組轉換爲字符串,只需撥打json_encode,但我沒有理由將其轉換爲數組,然後回到原來的狀態。

+0

這將返回一個不同的數組。我的例子不包含3個字符串,而是由3行組成的1個字符串。親自嘗試一下。但是,感謝您指出正確的方向。 – 2012-04-12 12:45:29

+0

添加了用於處理多行字符串的代碼。現在它輸出完全相同的數組。 – Andris 2012-04-13 10:07:38

+0

非常感謝! – 2012-04-13 15:44:05

0

我想這就是你想要什麼,

$string ="Folder1/Folder2/Folder3/filename1\n"; 
$string .="Folder1/Folder2/Folder3/filename2\n"; 
$string .="Folder4/Folder2/Folder3/filename3\n"; 


$string_array_1 = explode("\n", $string); 

$array_need = array(); 

foreach($string_array_1 as $array_values) 
{ 
     if($array_values) 
     { 
      $folders = explode("/", $array_values); 
      $array_need[$folders[0]][$folders[1]][$folders[2]][] = $folders[3]; 
     } 
    } 

print_r($array_need); 
+0

這很棒,但不是動態的。如果子文件夾的數量改變了Folder5/Folder2/Folder3/Folder4 /文件名4 – 2012-04-12 13:06:59

+0

確定,那麼等待將盡快更新。 – 2012-04-12 13:09:29