PHP преобразование конкретной строки в значения массива - PullRequest
2 голосов
/ 17 февраля 2010

я получаю этот ответ от сервера:

OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235 OK: 0; Sent queued message ID: 9589936487b8d0a1 SMSGlobalMsgID:6141138716371692 

и так далее ...

Это всего лишь одна длинная строка без возврата каретки, я скопировал ее в точности так, как получил.обратите внимание, что начальный ОК может быть другим словом, а 0 (в начале строки) может содержать до трех цифр.

это повторяющийся шаблон:

OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235

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

Array
(
    [0] => Array
           [1] => OK
           [2] => 0
           [3] => e3674786a1c5f7a1
           [4] => 6162865783958235

    [1] => Array
           [1] => OK
           [2] => 0
           [3] => 9589936487b8d0a1
           [4] => 6141138716371692 
)

Как бы вы поступили?Я ценю ваш вклад.

1 Ответ

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

Учитывая, что в качестве входных данных у вас есть эти данные:

$str = <<<STR
OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235
OK: 0; Sent queued message ID: 9589936487b8d0a1 SMSGlobalMsgID:6141138716371692
STR;


Решением будет explode этой строки в отдельных строках:

$lines = explode("\n", $str);

Правка после комментария и правка ОП

Учитывая, что данные, которые вы получаете, находятся только в одной строке, вам нужно будет найти другой способ разбить их (я думаю, что проще разбить данные и работать с «строками», которые работают с большим массивом данных сразу) .

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

$str = <<<STR
OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235 OK: 0; Sent queued message ID: 9589936487b8d0a1 SMSGlobalMsgID:6141138716371692
STR;

Полагаю, вы могли бы разбить его на "строки", используя preg_split, используя такое регулярное выражение, как этот:

$lines = preg_split('/SMSGlobalMsgID: (\d+) /', $str);

Если вы попытаетесь вывести содержимое $lines, оно выглядит вполне нормально - и теперь вы сможете перебирать эти строки.


Затем вы начинаете с инициализации массива $output как пустого:

$output = array();


И теперь вам нужно перебрать строки начального ввода, используя магию регулярных выражений в каждой строке:
См. Документацию preg_match и Regular Expressions (Perl-Compatible) для получения дополнительной информации

foreach ($lines as $line) {
  if (preg_match('/^(\w+): (\d+); Sent queued message ID: ([a-z0-9]+) SMSGlobalMsgID:(\d+)$/', trim($line), $m)) {
    $output[] = array_slice($m, 1);
  }
}

Обратите внимание на части, которые я захватил, используя ()


И, в конце концов, вы получите массив $output:

var_dump($output);

Это выглядит так:

array
  0 => 
    array
      0 => string 'OK' (length=2)
      1 => string '0' (length=1)
      2 => string 'e3674786a1c5f7a1' (length=16)
      3 => string '6162865783958235' (length=16)
  1 => 
    array
      0 => string 'OK' (length=2)
      1 => string '0' (length=1)
      2 => string '9589936487b8d0a1' (length=16)
      3 => string '6141138716371692' (length=16)
...