2011-07-02 17 views
15

decir que tengo una matriz:Implosionar una matriz asociativa en PHP

$array = Array(
    'foo' => 5, 
    'bar' => 12, 
    'baz' => 8 
); 

y me gustaría imprimir una línea de texto en mi opinión así:

"Los valores son: foo (5), bares (12), Baz (8)"

Lo que podría hacer es la siguiente:

$list = Array(); 
foreach ($array as $key => $value) { 
    $list[] = "$key ($value)"; 
} 
echo 'The values are: '.implode(', ',$list); 

pero siento que debe haber una manera más fácil, sin ja para crear la matriz $list como un paso adicional. He estado intentando array_map y array_walk, pero no tuve éxito.

Entonces mi pregunta es: ¿cuál es la mejor y más corta forma de hacer esto?

+0

no sé de una función incorporada para esto. Solo de var_export y var_dump, pero ambos lo muestran en un formato diff distinto al que desea – casraf

+0

También sugiero echar un vistazo a [http_build_query] (http://php.net/manual/en/function.http-build-query .php) función. No formatea el resultado de la manera en que lo hizo, pero es muy fácil de implementar. – T30

Respuesta

13

El problema con array_map es que la función de devolución de llamada no acepta la tecla como argumento. Se puede escribir su propia función para llenar el vacío aquí:

function array_map_assoc($callback , $array){ 
    $r = array(); 
    foreach ($array as $key=>$value) 
    $r[$key] = $callback($key,$value); 
    return $r; 
} 

Ahora usted puede hacer eso:

echo implode(',',array_map_assoc(function($k,$v){return "$k ($v)";},$array)); 
+0

¡Agradable! También he votado todas las respuestas, pero voy por ésta :) Fácil de agregar en una sola línea y aún bastante flexible. – Alec

+1

¿No produciría un recorrido de matriz extra (uno para 'matriz_tabla_asoc', otra para' implosión')? – CDuv

3

Se puede imprimir los valores a medida que iterar:

echo 'The values are: '; 
foreach ($array as $key => $value) { 
    $result .= "$key ($value),"; 
} 
echo rtrim($result,','); 
+0

que escribirá un ',' –

+0

@yi_H extra, exactamente; eso es lo que trato de evitar – Alec

+0

Convierta los ecos en una variable y después del foreach: 'eco trim ($ variable, ',');' –

9

Hay es una manera, pero it's pretty verbose (y posiblemente menos eficiente):

<?php 
$array = Array(
    'foo' => 5, 
    'bar' => 12, 
    'baz' => 8 
); 

// pre-5.3: 
echo 'The values are: '. implode(', ', array_map(
    create_function('$k,$v', 'return "$k ($v)";'), 
    array_keys($array), 
    array_values($array) 
)); 

echo "\n"; 

// 5.3: 
echo 'The values are: '. implode(', ', array_map(
    function ($k, $v) { return "$k ($v)"; }, 
    array_keys($array), 
    array_values($array) 
)); 
?> 

Sus miradas código original bien para mí

+0

Puede reemplazar 'create_function()' (que no es mejor que 'eval()', porque usa 'eval()';) solo una nota al costado) en php5.3 con 'function ($ k, $ v) {return "$ k ($ v)"; } ' – KingCrunch

+0

@KingCrunch: De hecho, una lambda real es mejor en 5.3. Sin embargo, todavía escribo 'create_function()' (lo cual está bien porque aquí no hay un código provisto por el usuario ... dejémos de lado el totalmente irrelevante 'eval()' -bashing) hasta que 5.3 esté muy extendido en las plataformas de producción. –

+0

@KingCrunch: (Sin embargo, edité mi pregunta para eludir mi aversión a la interpolación variable) –

0

me ocurrió con

foreach ($array as &$item) 
    { 
     $item = reset($item); 
    } 
    $array = implode(', ', $array); 
    var_dump($array); 
1

Tomando la ayuda de la respuesta de @ linepogl, edité el código para hacerlo más simple, y funciona bien.

function array_map_assoc($array){ 
    $r = array(); 
    foreach ($array as $key=>$value) 
    $r[$key] = "$key ($value)"; 
    return $r; 
} 

Y entonces, llamar a la función utilizando

echo implode(' , ', array_map_assoc($array)); 
0

Para mí, la mejor y más sencilla solución es la siguiente:

$string = http_build_query($array, '', ','); 
Cuestiones relacionadas