Php 给定一个字符串,使用正则表达式创建具有命名键的多维数组

Php 给定一个字符串,使用正则表达式创建具有命名键的多维数组,php,arrays,regex,multidimensional-array,Php,Arrays,Regex,Multidimensional Array,我正在使用PHP。例如,给定以下字符串: $str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]|a30" 通过|将其分解,我得到字符串: a2c4-8 a6c2,c3-5,c6[2],c8[4]-10,c14-21[5] a30 现在,我想将a后面的数字与所有其他字符分开,删除字母a和c(保留短划线、逗号和方括号),并将结果放入多维数组中,如下所示: Array ( [0] => Array (

我正在使用PHP。例如,给定以下字符串:

$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]|a30"
通过
|
将其分解,我得到字符串:

a2c4-8
a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]
a30
现在,我想将
a
后面的数字与所有其他字符分开,删除字母
a
c
(保留短划线、逗号和方括号),并将结果放入多维数组中,如下所示:

Array
(
    [0] => Array
        (
            [a] => 2
            [c] => 4-8
        )

    [1] => Array
        (
            [a] => 6
            [c] => 2,3-5,6[2],8[4]-10,14-21[5]
    )

    [2] => Array
        (
            [a] => 30
            [c] => 
        )

)
a
后面总是跟数字,在这个数字后面可能有一个
c
后面可能没有其他逗号分隔的字符串

请注意,在生成的数组中,字母
a
c
已被删除。所有其他字符都已保留。我试图通过Casimir和Hippolyte进行修改,但没有成功


A plus可以避免向生成的数组中添加空数组键(如上面最后一个
[c]

考虑使用
preg\u match\u all
函数和命名子任务(
(?p)
)和
preg\u SET\u ORDER
标志、
array\u map
数组过滤器来实现以下解决方案,
array\u column
(从PHP 5.5开始提供)和
trim
函数:

$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]|a30";
$parts = explode("|", $str);

$result = array_map(function ($v) {
    preg_match_all("/(?P<a>a\d+)?(?P<c>c[0-9-\[\]]+)?/", $v, $matches, PREG_SET_ORDER);
    $arr = [];
    $a_numbers = array_filter(array_column($matches, "a"));
    $c_numbers = array_filter(array_column($matches, "c"));
    if (!empty($a_numbers)) {
        $arr['a'] = array_map(function($v){ return trim($v, 'a'); }, $a_numbers)[0];
    }
    if (!empty($c_numbers)) {
        $arr['c'] = implode(",", array_map(function($v){ return trim($v, 'c'); }, $c_numbers));
    }

    return $arr;
}, $parts);

print_r($result);

另外,“空数组键”也被省略

分解后,您可能希望使用正则表达式来匹配不同的部分,然后将它们放入结果数组中(如下所示:)。
Array
(
    [0] => Array
        (
            [a] => 2
            [c] => 4-8
        )

    [1] => Array
        (
            [a] => 6
            [c] => 2,3-5,6[2],8[4]-10,14-21[5]
        )

    [2] => Array
        (
            [a] => 30
        )
)