我有以下字符串:
{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
。如果值中包含冒号,有什么更好的编码方式?
答案 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)
回答你的第二个问题:
如果您的格式与特定内容崩溃,那就太糟糕了。我认为有两种类型可以解决。
"
并且只转义那些引号(在这种情况下比你有JSON)n
字符是一个标记。第一种类型易于阅读和操作,尽管必须读取整个文件才能随机访问它。
如果结构没有保存字符数量,第二种类型对于更好的随机访问将是很好的(因为在UTF-8中你不能通过不读取它们来跳过n
字符),而是保存字节量到跳跃。 PHP的序列化函数产生n == strlen($token)
,因此我不知道与JSON相比有什么优势。
在可能的情况下,我尝试使用JSON进行不同系统之间的通信。