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