2013-04-16 118 views
0

有人能給我一個讓這個分解函數遞歸的手嗎?我的頭今天不工作。由多個分隔符將字符串分解爲多維數組php

function expl($str,$charlist='|'){ 
    $charlist = str_split($charlist); 
    foreach($charlist as $char){ 
     if(is_array($str)){ 
      for($i=0; $i<sizeof($str); $i++){ 
       $str[$i] = expl($str[$i],$char); 
      } 
     }else{ 
      return (explode($char,trim($str,$char))); 
     } 
    } 
    return($str); 
} 
echo "<pre>"; 
print_r(expl("A~a1~a2|B~b1~b2",'|~')); 
echo "</pre>"; 

應該輸出:

Array 
(
[0] => Array 
    (
     [0] => A 
     [1] => a1 
     [2] => a2 
    ) 
[0] => Array 
    (
     [0] => B 
     [1] => b1 
     [2] => b2 
    ) 
) 

回答

1
<?php 
function expl($str,$charlist='|'){ 
if(!$charlist) return($str); 
$char = $charlist[0]; 
$matrix = explode($char,$str); 
for($i=0; $i<sizeof($matrix); $i++){ 
    $matrix[$i] = expl($matrix[$i],substr($charlist,1)); 
} 
return($matrix); 
} 
echo "<pre>"; 
print_r(expl("A~a1~a2|B~b1~b2",'|~')); 
echo "</pre>"; 
?> 

會是這樣的...... 使用遞歸! 第一級將得到第一個矩陣,做這樣的事情 $ matrix [0] =「A〜a1〜a2」; $ matrix [1] =「B〜b1〜b2」; 然後,遞歸將做第二部分,這將使每個字符串成爲字符串的數組,這將成爲字符串的數組,直到沒有更多的分隔符=)

+0

順便說一下...我還沒有測試它!這只是一個算法的想法! – Magus

+0

感謝Magnus - 這正是我試圖用我的功能所做的。我已經編輯了你的答案來清理你的例子中的語法,但我仍然認爲這是不正確的。我在某個地方犯了錯嗎?它輸出的東西像數組(0 => Array(0 =>'〜')) – cronoklee

+0

太好了 - 我發現了問題並更新了答案。希望我的編輯將被同行接受 – cronoklee

0

簡單地做這樣的事情。 '|'然後按'〜'。它應該是這樣的:

$str="A~a1~a2|B~b1~b2"; 
$arr=explode("|",$str); 
$result=array(); 
foreach($arr as $k=>$v) 
{ 
    $arr1=explode("~",$v); 
    $result[]=$arr1; 
} 
+0

感謝格里,但想法是自動化,所以你可以有動態分隔符 – cronoklee

1

下面是一個工作例子,我已經在運行該功能提供了一個鏈接到你顯示輸出:

實例回報:

http://phpfiddle.org/api/run/4iz-i2x

用法:

echo '<pre>'; 
print_r(expl("A~a1~a2|B~b1~b2",'|~')); 
echo '</pre>'; 

功能:

<?php 

function expl($str,$charlist='|', $currentChar = 0, $continue = true){ 

    if(!$continue) 
    { 
     return $str; 
    } 

    $endArray = array(); 

    if($currentChar == 0){ 
     $charlist = str_split($charlist); 
    } 
    else 
    { 
     if($currentChar > count($charlist)) 
     { 
      return expl($str, $charlist, $currentChar, false); 
     } 
    } 

    if(!is_array($str)) 
    { 
     $pieces = explode($charlist[$currentChar], $str); 
     $currentChar++; 
     return expl($pieces, $charlist, $currentChar); 
    } 
    else{ 
     foreach($str as $arrayItem){ 
     if(is_array($arrayItem)) 
     { 
       return expl($str, $charlist, $currentChar, false); 
     } 

     $endArray[] = explode($charlist[$currentChar], $arrayItem); 

     } 


     $currentChar++; 
     return expl($endArray, $charlist, $currentChar);     
    }    
}  

?> 
+0

謝謝埃文 - 它絕對有效。這感覺有點複雜,但由於我沒有關於如何簡化它的任何想法,我認爲它現在會很好。 – cronoklee

+0

@cronoklee好吧,是的,我同意你的意見,但我急於建立這個。也許你可以改善它:) –