2010-01-17 99 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