2012-07-11 69 views
0

我有以下代码解析字符串转换成一组选项: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 
      ) 
) 

我当然没有正则表达式大师所以有人可以帮助我使功能理解嵌套[]分隔符?还有任何提高功能性能的东西都是非常值得欣赏的,因为我使用了很多功能来轻松地将选项传递给我的控制器。

+0

这尖叫递归。 – nickb 2012-07-11 12:33:17

+0

嗯,你正在尝试编写一个自定义的非串行化程序,它不是一件容易的事情。为什么你需要解析这样的结果? – 2012-07-11 12:33:21

回答

1

你为什么要发明自己的格式,而不是已经广泛建立的东西。

一些选项:

  • URL编码做这个
  • JSON
  • yalm
  • php的序列化()

你发明了一种全新的语法,以及标准的正则表达式韩元甚至不允许这样做,因为它有递归。你基本上需要编写一个解析器,所以如果你坚持自己的语法,最好的开始就是查看解析器生成器。

http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php/

+0

我希望我可以投票0,5 :) + 0.5注意有几个更好的解决方案,-0,5,因为他可能真的需要这样做,如果数据是由第三方提供的。 (尽管+1) – 2012-07-11 12:34:31

+0

好吧,我也给他写了一个解析器的起点;)感谢投票,虽然:P – Evert 2012-07-11 12:38:58

+0

这个想法是有一个简单而快速的方式发送一些选项到一个函数。一个典型的用法就像get_stuff(123,'limit = 5,render = grid,something = [1,5]'),这很容易理解并且写得很快。这些选项被解析成一个数组,可以检查特定的键,然后确定get_stuff函数(通常从数据库中获取)将会做什么。它的主要工具,使开发更容易,所以而不是数组(123,'限制'=> 5,'渲染'=>'网格','东西'=>数组(1,5))我可以通过一个简单的字符串,并让解析器处理其余部分。 – kasakka 2012-07-11 13:11:39

0

不要通过创建你的选择一个新的(不完整的,车和慢)解析器推倒重来。使用已有的解决方案: