【问题标题】:How can I use preg_match_all() to convert a string with 2 delimiters into an associative array?如何使用 preg_match_all() 将具有 2 个分隔符的字符串转换为关联数组?
【发布时间】:2015-07-30 02:36:32
【问题描述】:

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

【问题讨论】:

  • 您的正则表达式查找: 冒号,而您的示例使用| 管道作为分隔符。 (你的最终输出是如何以及在哪里产生的不是很清楚..)

标签: php arrays regex associative-array preg-match-all


【解决方案1】:

这应该适合你:

您实际上并不需要正则表达式。首先只需将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
)

【讨论】:

  • 我收到此错误:致命错误:调用未定义函数 array_column() 编辑:看起来我今晚将更新 php
  • @SourceMatters 然后你可能有低于 5.5 的 PHP 版本 (echo phpversion();)。所以只需将代码替换为:$arr = array_map(function($v){ return explode("|", $v); }, explode(",", $str)); $arr = array_combine( array_map(function($v){ return $v[0]; }, $arr), array_map(function($v){ return $v[1]; }, $arr) );
  • 输出看起来确实正确,但我得到一个通知:注意:未定义偏移量:这一行上的 1:return $v[1]; }, $arrPoints
  • @SourceMatters 您可能使用的字符串与此处显示的字符串不同!这意味着您没有相同数量的键和值。因为我无法复制它。我的代码工作正常:3v4l.org/HcNPO
  • @SourceMatters 而不是在我的代码中使用普通的$str。在它周围包裹一个trim() 调用,例如trim($str, ",") 然后在我的代码中使用它
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 2017-06-14
  • 2019-08-23
  • 2011-07-14
  • 2013-09-12
  • 2023-01-23
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多