我正在使用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 et Hippolyte 修改this answer,但没有成功。
加上将避免添加到结果数组中的空数组键(如上面的最后一个[c]
)。
答案 0 :(得分:1)
使用preg_match_all
函数考虑以下解决方案,其中包含已命名的子掩码((?P<a>)...
)和PREG_SET_ORDER
flag,array_map
,array_filter
,array_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
)
)
P.S。 &#34;空数组键&#34;也被省略