PHP:使用嵌套数组解析字符串到数组中?
我有以下代码解析字符串转换成一组选项:PHP:使用嵌套数组解析字符串到数组中?
$options = 'myvalue, test=123, myarray=[1,2]';
function parse_options($options)
{
$split = '/,(?=[^\]]*(?:\[|$))/';
if($options && is_string($options))
{
$temp_options = preg_split($split, $options);
$options = array();
foreach($temp_options as $option)
{
$option = trim($option);
if(strpos($option,'='))
{
//Is an option with a value
list($key, $value) = explode('=',$option);
if(strpos($value,'[') !== FALSE)
{
//Is an array of values
$value = explode(',', substr($value, 1,-1));
}
$options[$key] = $value;
}
else
{
$options[] = $option;
}
}
}
else
{
//Return empty array if not a string or is false
if(!is_array($options)) { $options = array(); }
}
return $options;
}
基本上它拆分通过逗号除非由括号包围。然后它检查key-> value对的值,然后尝试确定该值是否为数组。
这工作得很好,但我想改善它,以便它可以创建一些嵌套数组一样
$options = 'myvalue, test=123, bigwhopper=[ myarray=[1,2], test2=something ]';
这将输出
Array(
[0] => myvalue,
[test] => 123,
[bigwhopper] => Array(
[myarray] = Array(
[0] => 1,
[1] => 2
),
[test] => something
)
)
我当然没有正则表达式大师所以有人可以帮助我使功能理解嵌套[]分隔符?还有任何提高功能性能的东西都是非常值得欣赏的,因为我使用了很多功能来轻松地将选项传递给我的控制器。
你为什么要发明自己的格式,而不是已经广泛建立的东西。
一些选项:
- URL编码做这个
- JSON
- yalm
- php的序列化()
你发明了一种全新的语法,以及标准的正则表达式韩元甚至不允许这样做,因为它有递归。你基本上需要编写一个解析器,所以如果你坚持自己的语法,最好的开始就是查看解析器生成器。
http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php/
我希望我可以投票0,5 :) + 0.5注意有几个更好的解决方案,-0,5,因为他可能真的需要这样做,如果数据是由第三方提供的。 (尽管+1) – 2012-07-11 12:34:31
好吧,我也给他写了一个解析器的起点;)感谢投票,虽然:P – Evert 2012-07-11 12:38:58
这个想法是有一个简单而快速的方式发送一些选项到一个函数。一个典型的用法就像get_stuff(123,'limit = 5,render = grid,something = [1,5]'),这很容易理解并且写得很快。这些选项被解析成一个数组,可以检查特定的键,然后确定get_stuff函数(通常从数据库中获取)将会做什么。它的主要工具,使开发更容易,所以而不是数组(123,'限制'=> 5,'渲染'=>'网格','东西'=>数组(1,5))我可以通过一个简单的字符串,并让解析器处理其余部分。 – kasakka 2012-07-11 13:11:39
这尖叫递归。 – nickb 2012-07-11 12:33:17
嗯,你正在尝试编写一个自定义的非串行化程序,它不是一件容易的事情。为什么你需要解析这样的结果? – 2012-07-11 12:33:21