如何将分隔字符串转换为具有关联键的多维数组?

How to convert delimited string into multi-dimensional array with associative keys?

任何人都可以帮助这个正则表达式吗?

这是我尝试转换成 php 数组的示例字符串。

$str="hopOptions:hops hopOptions:salmonSafe region:domestic region:specialty region:imported"

我需要最后的数组是:

$filters = array (
    "hopOptions"  => array("hops", "salmonSafe"),
    "region"      => array("domestic", "specialty", "imported")
);

任何帮助或指导将不胜感激!

我不知道 php 想出了这个。希望有更好的方法。

$str = "hopOptions:hops hopOptions:salmonSafe region:domestic region:specialty region:imported";

// it creates an array of pairs
$ta = array_map(function($s) {return explode(":", $s);}, explode(" ", $str));

// this loop converts the paris into desired form
$filters = array();
foreach($ta as $pair) {
    if (array_key_exists($pair[0], $filters)) {
        array_push($filters[$pair[0]], $pair[1]);
    }
    else {
        $filters[$pair[0]] = array($pair[1]);
    }
}

print_r($filters);

输出:

Array
(
    [hopOptions] => Array
        (
            [0] => hops
            [1] => salmonSafe
        )

    [region] => Array
        (
            [0] => domestic
            [1] => specialty
            [2] => imported
        )

)

更快的方法是避免正则表达式并使用两个爆炸调用:

Demo

代码:

$str = "hopOptions:hops hopOptions:salmonSafe region:domestic region:specialty region:imported";
foreach(explode(' ',$str) as $pair){
    $x=explode(':',$pair);
    $result[$x[0]][]=$x[1];
}
var_export($result);

或者使用正则表达式...

PHP Demo

代码:

$str = "hopOptions:hops hopOptions:salmonSafe region:domestic region:specialty region:imported";
if(preg_match_all('/([^ ]+):([^ ]+)/',$str,$out)){
    foreach($out[1] as $i=>$v){
        $result[$v][]=$out[2][$i];
    }
    var_export($result);
}else{
    echo "no matches";
}