php将特定字符串转换为数组值

时间:2010-02-17 11:52:57

标签: php arrays string multidimensional-array

我从服务器得到这个回复:

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

依旧......

这只是一个长字符串,没有回车符我完全按照收到的方式复制了它。 请注意,初始OK可以是不同的单词,0(在字符串的开头)可以是最多3位数字。

这是重复的模式:

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 个答案:

答案 0 :(得分:1)

考虑到您将该数据作为字符串输入:

$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);

在评论和编辑OP后编辑

考虑到你收到的数据只有一行,你必须找到另一种方法来分割它(我认为分割数据和处理大量数据的“线”更容易

考虑到您收到的数据如下所示:

$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_matchRegular 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)