如何使用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
)