2017-07-04 4 views
1

Quelqu'un peut-il aider avec cette expression régulière s'il vous plaît?Comment convertir une chaîne délimitée en tableau multi-dimensionnel avec des clés associatives?

Voici un exemple de chaîne que j'essaie de convertir en tableau php.

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

Et je dois le aray final soit:

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

Toute aide ou direction sera grandement appréciée!

Répondre

0

plus rapide est d'éviter regex et utiliser deux appels: exploser

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

Ou avec ... 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 Est-il possible d'avoir d'espace dans vos valeurs? Ce serait une information pertinente pour votre question. – mickmackusa

+0

ouais l'objet dans la chaîne sera séparé par un espace, mais c'est tout pour les espaces. –

+0

Je vais choisir ceci comme réponse car il utilise regex. Mais je me rends compte que j'aurais pu utiliser les fonctions de tableau php pour obtenir des résultats similaires. Merci @mickamackusa –

0

Je ne connais pas php et est venu avec cela. J'espère qu'il y a un meilleur moyen.

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

Sortie:

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

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

)