2013-08-21 62 views
0

我有一個字符串從插座上拔掉:(這是一個字符串,沒有逃逸(/ R/N))如何把特定的字符串數組與特定按鍵PHP

PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN 
VERSION:2.0 
METHOD:PUBLISH 
X-CALENDARSERVER-ACCESS:PUBLIC 
BEGIN:VTIMEZONE 
TZID:Pacific Time 
BEGIN:STANDARD 
DTSTART:20081101T020000 
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU 
.... 

我想有它它是這樣的:

$data['PRODID'] = -//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN 
$data['VERSION'] = 2.0 
....... 

我做過嘗試parse_str但沒有奏效。有一個簡單的方法嗎?

+0

你要碰到的問題是,你有重複的鍵值.... BEGIN出現了兩次。 – Orangepill

+0

按行輸入並按「:」分割。 – alfasin

+0

提供了一個答案,顯示如何處理重複鍵。 – Orangepill

回答

1

編寫自己的腳本來解釋這一點將是非常微不足道的。

$lines = explode("\r\n", $string); 
$parsed = array(); 
foreach($lines as $line){ 
    list($key, $value) = explode(":", $line, 2); 
    $parsed[$key] = $value; 
} 

立即我看到一個點你的腳本將停止合理化,雖然這是重複的開始鍵。

爲了解決這個問題,你可以做的東西沿着這些路線:

$lines = explode("\n", $string); 
$parsed = array(); 
$current = &$parsed; 
foreach($lines as $line){ 
    list($key, $value) = explode(":", $line, 2); 
    if ($key == "BEGIN") { 
     $parsed[$value] = array(); 
     $current = &$parsed[$value]; 
    } else { 
     $current[$key] = $value; 
    } 
} 

這將產生輸出像

Array 
(
    [PRODID] => -//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN 
    [VERSION] => 2.0 
    [METHOD] => PUBLISH 
    [X-CALENDARSERVER-ACCESS] => PUBLIC 
    [VTIMEZONE] => Array 
     (
      [TZID] => Pacific Time 
     ) 

    [STANDARD] => Array 
     (
      [DTSTART] => 20081101T020000 
      [RRULE] => FREQ=YEARLY;BYMONTH=11;BYDAY=1SU 
     ) 

) 

對於上面的例子(注意如何一切後,開始塊被設置爲基於BEGIN值的子數組屬性)。

See it in Action

一個替代實施的iCalendar分析器可以看到this question

+0

嗨,沒有\ n(或\ r \ n),它是從套接字檢索到的一行。我以爲我提到過,對不起。你很近。 :) – user1873432

+0

@ user1873432如果你看到如圖所示的顯示(在不同的行上),那麼就有一個換行符和一個回車符。如果情況並非如此,則字符串全部在一行上。 – Orangepill

+0

根據[icalendar spec](http://tools.ietf.org/html/rfc2445),分隔符應該是'\ r \ n'。更新了答案以反映這一點。 – Orangepill

0

這樣做嗎?

$string = "...." // all the stuff you have there. 

$array = array(); 

// explode on newlines to go through it line by line 
foreach(explode("\n", $string) as $line) 
{ 
    // explode again by ':' and set the key/values 
    $tmp = explode(':', $line); 
    $array[$tmp[0]] = $tmp[1]; 
} 

只知道你要覆蓋鍵。 (你有兩次開始)。