Php 给定一个字符串,使用正则表达式创建具有命名键的多维数组
我正在使用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 (
$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
)
)