2011-09-27 71 views
1

我想爆炸這個文本三維陣列PHP爆炸文字多維數組

Q 11 21 21 (40 44 23 ! 24 ! ! Q ! 32 22 48 18 23 49 ! ! ! ! 24 23 Q ! 19 23 06 49 29 15 22 ! ! ! Q ! 20 (23 23 (40 ! ! ! ! Q ! 21 06 ! 22 22 22 02 ! ! ! 


Q ! (40 05 33 ! 05 ! ! ! ! Q ! 49 49 05 20 20 49 ! ! ! Q ! ! 05 34 (40 ((1 Q ! ! 46 46 46 46 46 46 ! ! ! Q (46 07 20 12 05 33 ! ! ! ! 

這時間表是文本形式。以下是確定陣列中每個值的條件:

  1. 新行=下一次表;
  2. Q =新的一天;
  3. space = next hour
  4. ! =免費小時,
  5. (= duplicit小時

而且我希望它是這樣的: 陣列[時間表] [日] [小時]

我怎麼能這樣做是否有選擇?通過PHP做它爆炸功能?

+2

滿足自己的好奇心:是一個標準的該格式的一部分? –

+2

你必須更好地解釋才能得到任何答案。 – amosrivera

+0

是什麼阻止你爲此編碼解析器?我的意思是你已經制定了格式,什麼阻止你繼續? – hakre

回答

2

沒有真正理解你的字符串是如何工作的;此代碼應該可以完成這項工作。

$timetables = explode("\n", $source); 

foreach($timetables as $tablekey => $days) 
{ 
    $timetables[$tablekey] = explode('Q', $days); 

    foreach($timetables[$tablekey] as $daykey => $hours) 
     $timetables[$tablekey][$daykey] = explode(' ', $hours) 
} 

print_r($timetables, true); 
3

真是一個好格式!我想我還是不明白這一點,但我會盡力回答反正...

  1. 使用explode爲「\ n」,你會得到時間表
  2. 這個數組的每個元素的數組,其本身的explode有「Q」替換它,你就會有一個2維數組
  3. 這個數組的每個元素的每個元素,用自身的explode有'

嘗試更換元素來做到這一點,如果你有麻煩了,你會來的代碼編輯你的問題與...一起。

0
$x = //... 
$x = explode("\n", $x); 
foreach($x as $k => $v) { 
    $x[$k] = explode("Q", $x[$k]); 
    foreach($x[$k] as $kk => $vv) { 
    $x[$k][$kk] = explode(" ", $x[$k][$kk]); 
    } 
} 

With array_map我想你會得到更好的代碼。

+1

語義代碼讓你更好地升級tbh。 – sg3s

0

這裏是一個遞歸函數,它的分隔符的數組:

function multi_explode($delimiters, $val) { 
    $delimiter = array_shift($delimiters); 
    if (!empty($delimiter)) { 
     $val = explode($delimiter, $val); 
     foreach($val as $key => $valval) { 
      $val[$key] = multi_explode($delimiters, $valval); 
     } 
    } 
    return $val; 
}