字符串到数组没有爆炸

时间:2010-01-17 18:28:42

标签: php curl

我正在使用api从另一台服务器检索数据,返回的数据是这样的:

accountid=10110 type=prem servertime=1263752255 validuntil=1266163393 
username= curfiles=11 curspace=188374868 bodkb=5000000 premkbleft=24875313

这是一个完整的字符串我需要整个字符串中的两个值,我目前正在使用preg_match来获取它,但只是为了了解更多并改进我的编码是否有任何其他方式或函数,其中所有值都自动转换为阵列

谢谢。

3 个答案:

答案 0 :(得分:1)

Sooo,我的快于 - preg_split基于strpos的函数如下所示:

function unpack_server_data($serverData)
{
    $output = array();
    $keyStart = 0;
    $keepParsing = true;

    do
    {
        $keyEnd = strpos($serverData, '=', $keyStart);
        $valueStart = $keyEnd + 1;
        $valueEnd = strpos($serverData, ' ', $valueStart);
        if($valueEnd === false)
        {
            $valueEnd = strlen($serverData);
            $keepParsing = false;
        }

        $key = substr($serverData, $keyStart, $keyEnd - $keyStart);
        $value = substr($serverData, $valueStart, $valueEnd - $valueStart);
        $output[$key] = $value;

        $keyStart = $valueEnd + 1;
    }
    while($keepParsing);

    return $output;
}

它查找一个等号字符,然后查找一个空格字符,并使用这两个来决定一个键名开始的位置,以及一个值名称何时开始。

答案 1 :(得分:0)

尝试parse_str或许你需要在

之前做str_replace(' ', '&', $string);

答案 2 :(得分:0)

无论如何,使用爆炸是最快的。

但是,要回答你的问题,你可以通过多种方式做到这一点。但仅仅因为你可以,并不意味着你应该。但如果你真的想让它变得怪异,试试这个。

使用strpos更新

$arr = array();
$begin = 0;
$str = trim($str); # remove leading and trailing whitespace
while ($end = strpos($str, ' ', $begin)) {
    $split = strpos($str, '=', $begin);
    if ($split > $end) break;
    $arr[substr($str, $begin, $split-$begin)] = substr($str, $split+1, $end-$split-1);
    $begin = $end+1;
}