2010-01-17 54 views
0

我使用的API从数据返回另一台服务器获取数据是这样的:字符串数组没有爆炸

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

这是一整串我需要两个值进行整串的,我目前使用preg_match来获得它,但只是为了学习更多,并改善我的编码是否有任何其他方式或函数,其中所有的值都会自动转换为数组?

谢谢。

回答

0

str_replace(' ', '&', $string);使用爆炸是最快的这一点,不管是什么。

但是,要回答您的问题,您可以采取多种方式。但仅仅因为你可以,并不意味着你应该。但如果你真的想让它变得奇怪,试试这个。

使用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; 
} 
+0

这是什么手动迭代通过一个字符串? Strpos可能更加神秘,但速度要快上几十倍。 – zneak 2010-01-17 18:37:48

+0

有一件事情保持将值赋给变量的习惯,因为我会在每次循环时检查strlen – Shishant 2010-01-17 18:44:56

+0

我想print_r和echo $ arr,但没有打印数组的值Array() – Shishant 2010-01-17 19:00:37

0

尝试parse_str也许你需要前

+0

不起作用。 'parse_str'(不是parse-str)期望&符号作为键值分隔符。 – zneak 2010-01-17 18:36:07

+2

这就是为什么他需要str_replace()它 – antpaw 2010-01-17 18:37:54

+1

当我评论时,那不是那里。 (如果他的用户字符串可以包含&符号,它会失败。) – zneak 2010-01-17 18:38:43

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; 
} 

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

+0

你的函数有错误,只有字符串的第一个值被转换为关键字。 – Shishant 2010-01-17 19:06:26

+0

我试着用你提供给我们的字符串,它会产生好的结果。你用这个字符串测试过吗?如果你没有,你可以发布你使用的那个吗? – zneak 2010-01-17 19:10:47