2009-09-11 17 views
5

Decir que tengo un array de pares clave/valor en PHP:¿Cómo combinar las claves y valores de una matriz en PHP

array('foo' => 'bar', 'baz' => 'qux'); 

¿Cuál es la forma más sencilla de transformar esta a una matriz que tiene el siguiente ?

array('foo=bar', 'baz=qux'); 

decir

array(0 => 'foo=bar', 1 => 'baz=qux'); 

en Perl, que haría algo así como

map { "$_=$hash{$_}" } keys %hash 

¿Hay algo como esto en el panoply of array functions en PHP? Nada de lo que veía parecía una solución conveniente.

Respuesta

9
function parameterize_array($array) { 
    $out = array(); 
    foreach($array as $key => $value) 
     $out[] = "$key=$value"; 
    return $out; 
} 
+0

Acepto esta respuesta porque es simple, y cómo terminé resolviendo mi problema. Estoy decepcionado de que no haya forma de hacerlo en una sola expresión, evitando la necesidad de la variable temporal $ out. – nohat

+3

Si usted es un usuario de Perl, esta será solo una de las muchas, muchas desilusiones que encontrará en el transcurso de su experiencia con PHP. – chaos

+0

@chaos Sí, la vida es difícil y php es legible. @nohat Aunque esto no "transforma" la matriz como lo estipula su pregunta. Hace uno nuevo. "Panoplia de funciones de matriz"? Risilla. – GZipp

0

caos 'la respuesta es agradable y recta. Sin embargo, para un sentido más general, es posible que haya perdido la función array_map(), que es lo que mencionó con su ejemplo map { "$_=$hash{$_}" } keys %hash.

+0

array_map(), al parecer, solo le proporciona los valores de la matriz – nohat

+0

Desafortunadamente, el código equivalente estricto en PHP debajo de 5.3 es 'create_function()' -using abomination. – chaos

+0

Ah, nohat, si necesita las teclas, entonces puede usar 'array_walk()' en su lugar (aunque eso modifica la matriz en su lugar en lugar de devolver una nueva matriz). – Amber

3

Una forma "curioso" que hacerlo = P

// using '::' as a temporary separator, could be anything provided 
// it doesn't exist elsewhere in the array 
$test = split('::', urldecode(http_build_query($test, '', '::'))); 
+0

Encontré la misma solución, pero soy "curioso") sobre el proceso de codificación/decodificación si es monosemantic. Intenté usarlo para organizar rápidamente las condiciones de consulta en ORM, pero por alguna razón tengo dudas sobre la seguridad de los datos cuando urlencode/urldecode. –

13

Otra opción para este problema: En PHP 5.3+ puede utilizar array_map() con un cierre (se puede hacer esto con PHP 5.2 antes, pero la ¡el código se pondrá bastante desordenado!).

"¡Oh, pero en array_map() solo obtiene el valor!".

Sí, así es, ¡pero podemos mapear más de una matriz! :)

$arr = array('foo' => 'bar', 'baz' => 'qux'); 
$result = array_map(function($k, $v){ 
    return "$k=$v"; 
}, array_keys($arr), array_values($arr)); 
Cuestiones relacionadas