Строка в массив без взрыва - PullRequest
0 голосов
/ 17 января 2010

Я использую API для извлечения данных с другого сервера, возвращенные данные выглядят примерно так:

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

Это целая строка. Мне нужно два значения из всей строки, в настоящее время я использую preg_match, чтобы получить ее, но просто чтобы узнать больше и улучшить кодирование, есть какой-то другой способ или функция, в которой все значения автоматически преобразуются в массив

Спасибо.

Ответы [ 3 ]

1 голос
/ 17 января 2010

Ооо, моя более быстрая чем 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 голосов
/ 17 января 2010

Использование взрыва является самым быстрым для этого, несмотря ни на что.

Однако, чтобы ответить на ваш вопрос, вы можете сделать это многими способами. Но только потому, что вы можете, не значит, что вы должны. Но если ты действительно хочешь сделать это странным, попробуй это.

Обновлено с помощью 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 голосов
/ 17 января 2010

попробовать parse_str может быть, вам нужно сделать str_replace(' ', '&', $string); до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...