我很少使用正则表达式,但我认为我可能遇到了一种很好地调用它们的情况(使用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
)