我有以下字符串:
{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
。如果值中有冒号,有什么更好的编码方法?
为什么不对爆炸函数设置限制。像这样:
$ve = explode(':', $vv, 2);
这样,字符串将只在第一次出现冒号时拆分。
为了解决值嵌入冒号的可能性,并且为了讨论(不一定是性能):
$ve = explode(':', $vv);
$key = array_shift($ve);
$vx[$key] = implode(':', $ve);
获取数组的第一个元素,假设索引中没有冒号。然后用冒号重新连接数组的其余部分。
不要对所有内容都使用effing explode
。
使用一个琐碎的键:value regex,可以更可靠地提取这种简单的格式。特别是因为它们周围有整齐的分隔符。
而且它的代码要少得多:
preg_match_all('/{('w+):([^}]+)}/', $vf, $match);
$array = array_combine($match[1], $match[2]);
'w+
只匹配一个字母数字字符串,而[^}]+
则匹配任何直到结束的}
。array_combine
更容易将其转换为key=>值数组。
回答您的第二个问题:
如果您的格式与特定内容冲突,那就很糟糕。我认为有两种类型可以解决。
- 转义分隔符:也就是说,每个冒号和大括号都必须转义,这很奇怪,所以数据用例如
"
来分隔,并且只有那些引号是转义的(在这种情况下是JSON) - 节省数据长度:这是PHP序列化数组的方式。在该数据结构中,您说下一个
n
字符是一个令牌
第一种类型很容易读取和操作,尽管必须读取整个文件才能随机访问它。如果结构不节省字符数量(因为在UTF-8中,不能通过不读取n
字符来跳过它们),但可以节省要跳过的字节数量,那么第二种类型将非常适合更好的随机访问。PHP的序列化函数生成n == strlen($token)
,因此我不知道与JSON相比有什么优势。
在可能的情况下,我尝试使用JSON在不同的系统之间进行通信。