如何使用特定键PHP将特定字符串放在数组中

时间:2013-08-21 21:09:09

标签: php arrays string

我有一个从套接字拉出的字符串:(它是一个没有转义的单个字符串(/ r / n))

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但是没有用。有一个简单的方法吗?

2 个答案:

答案 0 :(得分: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 Parser的替代实现,您可以看到this question

答案 1 :(得分: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];
}

请注意,您要覆盖密钥。 (你有BEGIN两次)。