解析此字符串并从中创建数组的最佳方法

时间:2015-03-16 23:03:29

标签: php arrays string

我有以下字符串:

{item1:test},{item2:hi},{another:please work}

我想要做的是把它变成一个如下所示的数组:

[item1] => test
[item2] => hi
[another] => please work

以下是我目前正在使用的代码(有效):

$vf = '{item1:test},{item2:hi},{another:please work}';
$vf = ltrim($vf, '{');
$vf = rtrim($vf, '}');
$vf = explode('},{', $vf);

foreach ($vf as $vk => $vv)
{
    $ve = explode(':', $vv);
    $vx[$ve[0]] = $ve[1];
}

我担心的是;如果值中有冒号怎么办?例如,假设item1的值为you:break。冒号会让我完全失去break。如果值中包含冒号,有什么更好的编码方式?

4 个答案:

答案 0 :(得分:2)

为了解决嵌入冒号的值的可能性,并且为了讨论(不一定是性能):

$ve = explode(':', $vv);
$key = array_shift($ve);
$vx[$key] = implode(':', $ve);

...抓取数组的第一个元素,假设索引中没有冒号。然后用冒号重新连接数组的其余部分。

答案 1 :(得分:2)

为什么不设置爆炸功能的限制。像这样:

$ve = explode(':', $vv, 2);

这样,字符串只会在第一次出现冒号时分裂。

答案 2 :(得分:1)

不要为所有事情使用效率explode

您可以使用一个简单的键:值正则表达式更可靠地提取这些简单格式。特别是因为你周围有整齐的分隔符。

它的代码要少得多:

preg_match_all('/{(\w+):([^}]+)}/', $vf, $match);
$array = array_combine($match[1], $match[2]);

\w+只匹配一个字母数字字符串,[^}]+直到结束}。并且array_combine更容易将其转换为key =>值数组。

答案 3 :(得分:0)

回答你的第二个问题:

如果您的格式与特定内容崩溃,那就太糟糕了。我认为有两种类型可以解决。

  1. 转义分隔符:那就是,每个冒号和大括号都必须被转义,这是奇怪的,所以数据是用例如分隔的。 "并且只转义那些引号(在这种情况下比你有JSON)
  2. 保存数据长度:这是PHP序列化数组的方式。在您说的数据结构中,下一个n字符是一个标记。
  3. 第一种类型易于阅读和操作,尽管必须读取整个文件才能随机访问它。 如果结构没有保存字符数量,第二种类型对于更好的随机访问将是很好的(因为在UTF-8中你不能通过不读取它们来跳过n字符),而是保存字节量到跳跃。 PHP的序列化函数产生n == strlen($token),因此我不知道与JSON相比有什么优势。

    在可能的情况下,我尝试使用JSON进行不同系统之间的通信。