PHP:将字符串转换为多维数组

3
我想将一个字符串转换为数组,但是当该字符串包含括号中的项时,我希望创建一个多维数组。
例如,如果传递了以下字符串:(Mary Poppins) Umbrella (Color Yellow)
我想创建一个如下所示的数组:
Array ( [0] => Array ( [0] => mary [1] => poppins) [1] => umbrella [2] => Array ( [0] => color [1] => yellow) )

我能通过以下方式将数据放入数组中:
```` array.push(data); ````
preg_match_all('/\(([A-Za-z0-9 ]+?)\)/', stripslashes($_GET['q']), $subqueries); 

但我在将项目放置到多维数组中遇到了问题。

有什么建议吗?


3
顺便提一句,她的名字是“Mary Poppins”。 - deceze
使用递归(递归正则表达式和递归函数调用) - Tom Regner
会有嵌套的括号吗?hello(cool (foo bar) (troll (attempt baz))) - HamZa
不会有嵌套的括号。 - zeropsi
1
如果您有权限控制字符串的格式,JSON表示法会更容易。 - Travesty3
3
你们,玛丽·波普因斯使用了一把黑色的雨伞。而另一方面,玛丽·波普因斯(拼写为“Poppens”,带有一个e)使用了一把黄色的雨伞。请确保你在修改所有方面都完美无缺的问题之前,对该问题有足够的了解! - webbiedave
1个回答

6

通过一些 PHP 技巧:

$string = '(Mary Poppens) Umbrella (Color Yellow)';
$array = array();
preg_replace_callback('#\((.*?)\)|[^()]+#', function($m)use(&$array){
    if(isset($m[1])){
        $array[] = explode(' ', $m[1]);
    }else{
        $array[] = trim($m[0]);
    }
}, $string);
print_r($array);

输出:

Array
(
    [0] => Array
        (
            [0] => Mary
            [1] => Poppens
        )

    [1] => Umbrella 
    [2] => Array
        (
            [0] => Color
            [1] => Yellow
        )

)

在线演示

请注意,由于我使用了匿名函数,因此您需要 PHP 5.3+。


兼容吗?

$string = '(Mary Poppens) Umbrella (Color Yellow)';

preg_match_all('#\((.*?)\)|[^()]+#', $string, $match, PREG_SET_ORDER);

foreach($match as $m){
    if(isset($m[1])){
        $array[] = explode(' ', $m[1]);
    }else{
        $array[] = trim($m[0]);
    }
}

print_r($array);

在线演示

测试过的PHP版本为4.3及以上


1
谢谢回复。我应该先说明一下。我使用的是 PHP 5.2.x 版本。 - zeropsi
1
仍然可用,只需将匿名函数替换为常规函数,并将名称作为回调传递。 - Neil Aitken
你真的应该升级到更新的 PHP 版本! - HamZa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接