2017-07-04 2 views
1

Kann jemand bitte mit diesem regulären Ausdruck helfen?Wie konvertiert man einen begrenzten String in ein multidimensionales Array mit assoziativen Schlüsseln?

Hier ist ein Beispiel String Ich versuche, in PHP-Array zu konvertieren.

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

Und ich die letzte aray sein müssen:

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

Jede mögliche Hilfe oder Richtung wird sehr geschätzt!

Antwort

0

Schneller ist regex zu vermeiden und zwei Anrufe explodieren verwenden:

Demo

Code:

$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); 

Oder mit regex ...

PHP Demo

Code:

$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"; 
} 
+0

@VadimGoncharov Gibt es eine Möglichkeit, beliebige Räume in Ihre Werte? Dies wäre eine relevante Information für Ihre Frage. – mickmackusa

+0

yeah thachach Element in Zeichenfolge wird durch ein Leerzeichen getrennt, aber das ist es für Leerzeichen. –

+0

Ich werde dies als Antwort auswählen, da es Regex verwendet. Aber ich weiß, dass ich nur PHP-Array-Funktionen verwendet haben könnte, um ähnliche Ergebnisse zu erzielen. Danke @mickamackusa –

0

Ich weiß nicht PHP und kam mit diesem. Hoffe, es gibt einen besseren Weg.

$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); 

Ausgang:

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

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

) 
Verwandte Themen