首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定一个字符串,创建一个具有命名键的多维数组,并指定一个正则表达式。

给定一个字符串,创建一个具有命名键的多维数组,并指定一个正则表达式。
EN

Stack Overflow用户
提问于 2016-06-28 15:21:15
回答 1查看 113关注 0票数 2

例如,我使用的是PHP.提供的以下字符串:

代码语言:javascript
复制
$str = "a2c4-8|a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]|a30"

然后由|爆炸,我得到了字符串:

代码语言:javascript
复制
a2c4-8
a6c2,c3-5,c6[2],c8[4]-10,c14-21[5]
a30

现在,我想将a后面的数字与所有其他字符分开,删除字母ac (保留破折号、逗号和方括号),并将结果放在多维数组中,如下所示:

代码语言:javascript
复制
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,后面跟着其他逗号分隔的字符串。

注意,在结果数组中,已经删除了字母ac。所有其他角色都保留了下来。我试着用Casimir et Hippolyte修改this answer,但没有成功。

A加上将避免添加到结果数组中的空数组键(作为上面的最后一个[c] )。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-28 16:51:02

考虑使用带有命名子掩码((?P<a>)...)和PREG_SET_ORDER标志、array_maparray_filterarray_column(自PHP5.5以来可用)和trim函数的PREG_SET_ORDER函数的以下解决方案:

代码语言:javascript
复制
$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);

产出:

代码语言:javascript
复制
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
        )
)

“空数组键”也被省略。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38080232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档