如何使用 preg_match_all() 将具有 2 个分隔符的字符串转换为关联数组?
How can I use preg_match_all() to convert a string with 2 delimiters into an associative array?
我很少使用正则表达式,但我认为我可能遇到需要它们的情况(使用 preg_match_all)。
输入:
10 - RIGHT SIDE|Validated,11 - ENTRY DOOR|Validated,20 - ENTRY DOOR|Not Validated
我试图在逗号上拆分每个数组索引,理想情况下,键是管道之前的文本,值是每次拆分中管道之后的文本。
预期输出:
array(0): key(10 - RIGHT SIDE) => value(Validated)
array(1): key(11 - ENTRY DOOR) => value(Validated)
array(2): key(20 - ENTRY DOOR) => value(Not Validated)
这将始终是一长串文本。
这是我尝试过的:
preg_match_all('/([^|]*?):([^,]*),?/', $strPoints, $arrPoints);
$out = array_combine($arrPoints[1], $arrPoints[2]);
这给了我一些接近的东西(截断了输出):
Array
(
[29 - Em Exit] => ENTERTAINMENT AREA|Not Validated
[35 - Em Exit] => ENTERTAINMENT AREA|Validated
[36 - Em Exit] => ENTERTAINMENT AREA|Validated
)
这应该适合你:
你真的不需要正则表达式。首先只是 explode()
你的字符串用逗号分隔成一个数组。这样你就有了一个数组,例如
Array
(
[0] => 10 - RIGHT SIDE|Validated
[1] => 11 - ENTRY DOOR|Validated
[2] => 20 - ENTRY DOOR|Not Validated
)
在此之后,您使用 array_map()
遍历每个数组元素并再次展开它,但这次是通过管道。然后你将得到这个数组:
Array
(
[0] => Array
(
[0] => 10 - RIGHT SIDE
[1] => Validated
)
[1] => Array
(
[0] => 11 - ENTRY DOOR
[1] => Validated
)
[2] => Array
(
[0] => 20 - ENTRY DOOR
[1] => Not Validated
)
)
最后,您可以简单地使用 array_column()
将 0 列用作键,将 1 列用作值。
所以完整的代码看起来像这样:
<?php
$str = "10 - RIGHT SIDE|Validated,11 - ENTRY DOOR|Validated,20 - ENTRY DOOR|Not Validated";
$arr = array_column(array_map(function($v){
return explode("|", $v);
}, explode(",", $str)), 1, 0);
print_r($arr);
?>
输出:
Array
(
[10 - RIGHT SIDE] => Validated
[11 - ENTRY DOOR] => Validated
[20 - ENTRY DOOR] => Not Validated
)
我很少使用正则表达式,但我认为我可能遇到需要它们的情况(使用 preg_match_all)。
输入:
10 - RIGHT SIDE|Validated,11 - ENTRY DOOR|Validated,20 - ENTRY DOOR|Not Validated
我试图在逗号上拆分每个数组索引,理想情况下,键是管道之前的文本,值是每次拆分中管道之后的文本。
预期输出:
array(0): key(10 - RIGHT SIDE) => value(Validated)
array(1): key(11 - ENTRY DOOR) => value(Validated)
array(2): key(20 - ENTRY DOOR) => value(Not Validated)
这将始终是一长串文本。
这是我尝试过的:
preg_match_all('/([^|]*?):([^,]*),?/', $strPoints, $arrPoints);
$out = array_combine($arrPoints[1], $arrPoints[2]);
这给了我一些接近的东西(截断了输出):
Array
(
[29 - Em Exit] => ENTERTAINMENT AREA|Not Validated
[35 - Em Exit] => ENTERTAINMENT AREA|Validated
[36 - Em Exit] => ENTERTAINMENT AREA|Validated
)
这应该适合你:
你真的不需要正则表达式。首先只是 explode()
你的字符串用逗号分隔成一个数组。这样你就有了一个数组,例如
Array
(
[0] => 10 - RIGHT SIDE|Validated
[1] => 11 - ENTRY DOOR|Validated
[2] => 20 - ENTRY DOOR|Not Validated
)
在此之后,您使用 array_map()
遍历每个数组元素并再次展开它,但这次是通过管道。然后你将得到这个数组:
Array
(
[0] => Array
(
[0] => 10 - RIGHT SIDE
[1] => Validated
)
[1] => Array
(
[0] => 11 - ENTRY DOOR
[1] => Validated
)
[2] => Array
(
[0] => 20 - ENTRY DOOR
[1] => Not Validated
)
)
最后,您可以简单地使用 array_column()
将 0 列用作键,将 1 列用作值。
所以完整的代码看起来像这样:
<?php
$str = "10 - RIGHT SIDE|Validated,11 - ENTRY DOOR|Validated,20 - ENTRY DOOR|Not Validated";
$arr = array_column(array_map(function($v){
return explode("|", $v);
}, explode(",", $str)), 1, 0);
print_r($arr);
?>
输出:
Array
(
[10 - RIGHT SIDE] => Validated
[11 - ENTRY DOOR] => Validated
[20 - ENTRY DOOR] => Not Validated
)