2011-02-07 11 views
16

Tengo una cadena como esta:PHP - Separar una cadena en pares clave/valor

clave = valor, clave2 = valor2

y me gustaría analizar en algo como esto:

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

que podía hacer algo así como

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

Pero esto parece ridiculo. Debe haber alguna forma de hacer esto de forma más inteligente con PHP, ¿verdad?

+0

¿De dónde provienen sus datos? ¿Usted controla cómo se almacena? ¿Se supone que es un formato legible por humanos (y editable)? –

Respuesta

18

Si no les importa usar expresiones regulares ...

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

Usted me ganó en ese – JPelletier

+0

sin embargo ... usando explotar y bucle como en el ejemplo OP es más que probable que demuestre ser más eficiente que el uso de expresiones regulares para analizarlo. –

+1

Nunca se sabe antes de compararlo. Depende en gran medida del patrón de uso. – etarion

11

si cambia de cadena que se utiliza en lugar de &, como delimitador, puede utilizar parse_str()

+2

'parse_str' también URL-decodes. – aaz

2

Si puede cambiar el formato de la cadena para ajustarse a una cadena de consulta URL (usando & en lugar de ,, entre otras cosas, puede usar parse_str. Asegúrese de utilizar la opción de dos parámetros.

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