【问题标题】:Convert key/value string into associative array将键/值字符串转换为关联数组
【发布时间】:2016-07-21 22:57:51
【问题描述】:

例如,我的字符串可能如下所示:

first_name:Tom last_name:Jones email:tom@somedomain.com

我希望我的数组如下所示:

Array (
  ['first_name'] => 'Tom',
  ['last_name'] => 'Jones',
  ['email'] => 'tom@somedomain.com'
)

这将用于根据列和值搜索数据库。因此,我首先需要检索键(例如 first_name)和值(例如 Tom)进行搜索。

我有以下正则表达式:

((?:[a-z][a-z0-9_]*))

这行得通。它会找到: 之前和: 之后的所有字符串,但我不知道如何解析它以将其放入我需要的格式的数组中。

【问题讨论】:

    标签: php arrays regex string


    【解决方案1】:

    您可以先将explode() 您的字符串放在空格上,然后将array_map() 每个值放在冒号上。之后只需使用array_column() 将键和值设置到位:

    $result = array_column(array_map(function($v){
        return explode(":", $v);
    }, explode(" ", $str)), 1, 0);
    

    您也可以在开始时使用正则表达式并使用命名的捕获组,例如

    preg_match_all("/(?P<keys>\w+):(?P<values>[\w@]+)/", $str, $m);
    $result = array_combine($m["keys"], $m["values"]);
    

    【讨论】:

    • 完美!将您标记为答案。我忘了explode()
    • @ScottPlunkett 不客气。我还添加了一个解决方案,您可以如何使用正则表达式来做到这一点。
    【解决方案2】:

    上述方法有效,但在我看来过于难以阅读。您可以使用以下方法更轻松、更高效地执行此操作,而无需进行三个额外的函数调用。

    $user_info = 'first_name:Tom last_name:Jones email:tom@somedomain.com';
    
    $user = array();
    foreach (explode(' ', $user_info) as $property) {
        $part = explode(':', $property);
        $user[$part[0]] = $part[1];
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 2019-06-26
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2018-03-08
      相关资源
      最近更新 更多