2011-02-07 13 views
16

mam ciąg jak poniżej:PHP - Split String w par klucz/wartość

klucz = wartość, Klawisz2 = value2

i chciałbym analizować go w coś takiego:

array(
    "key" => "value", 
    "key2" => "value2" 
) 

mógłby zrobić coś podobnego

$parts = explode(",", $string) 
$parts = array_map("trim", $parts); 
foreach($parts as $currentPart) 
{ 
    list($key, $value) = explode("=", $currentPart); 
    $keyValues[$key] = $value; 
} 

Ale wydaje się to niedorzeczne. Musi być jakiś sposób, aby zrobić to mądrzejszy z PHP, prawda?

+0

Skąd pochodzą Twoje dane? Czy kontrolujesz sposób przechowywania? Czy ma to być format czytelny dla ludzi (i zapisywalny)? –

Odpowiedz

18

Jeśli nie przeszkadza przy użyciu regex ...

$str = "key=value, key2=value2"; 
preg_match_all("/([^,= ]+)=([^,= ]+)/", $str, $r); 
$result = array_combine($r[1], $r[2]); 
var_dump($result); 
+0

Pokonałeś mnie na tym – JPelletier

+0

jednak ... używając rozbić i pętli jak w przykładzie OP będzie bardziej niż prawdopodobnie okazać się bardziej skuteczny niż przy użyciu regex do parsowania. –

+1

Nigdy o tym nie wiesz, zanim to porównasz. To zależy w dużej mierze od wzoru użycia. – etarion

11

jeśli zmienisz ciąg znaków do wykorzystania & zamiast , jako separatora można użyć parse_str()

+2

'parse_str' także dekodowania adresów URL. – aaz

2

Jeśli można zmienić format ciągu znaków zgodny z ciągiem zapytania adresu URL (przy użyciu & zamiast , można między innymi użyć opcji parse_str. Należy użyć opcji z dwoma parametrami:

13
<?php parse_str(str_replace(", ", "&", "key=value, key2=value2"), $array); ?>