2009-01-02 10 views
93

Estoy buscando una manera rápida de convertir una matriz asociativa en una cadena. La estructura típica sería como una cadena de consulta URL pero con separadores personalizables, así que puedo usar '&' para enlaces xhtml o '&' de lo contrario.La forma más rápida de implosionar una matriz asociativa con las claves

Mi primera inclinación es usar foreach pero dado que mi método podría ser llamado muchas veces en una sola solicitud, me temo que podría ser demasiado lento.

<?php 
$Amp = $IsXhtml ? '&amp;' : '&'; 
$Parameters = array('Action' => 'ShowList', 'Page' => '2'); 
$QueryString = ''; 
foreach ($Parameters as $Key => $Value) 
     $QueryString .= $Amp . $Key . '=' . $Value; 

¿Hay una manera más rápida?

+4

No olvide que si está imprimiendo HTML, la sintaxis correcta es & not &, iow this is wrong JOE sí funciona, pero es HTML no válido. – TravisO

Respuesta

143

Puede usar http_build_query() para hacer eso.

Genera una cadena de consulta codificada en URL de la matriz asociativa (o indexada) provista.

+0

Estaba tratando de encontrar este método en la API de PHP, este es definitivamente el camino a seguir. Si no, la alternativa es usar un método implode modificado como http://uk2.php.net/manual/en/function.implode.php#84684 pero http_build_query() será más rápido. –

+0

Me pregunto si esta es realmente la manera más rápida para la pregunta general. Hay alguna codificación pasando en esta función. Entonces, si no es por una URL, ¿es esto realmente más rápido que array_walk y qué pasa si no quieres que esté codificado? –

+5

el problema es 'http_build_query' escape especial char – Sisyphus

32

Como acotación al margen, yo estaba en la búsqueda para encontrar la mejor manera de implosionar una matriz asociativa pero usando mis propios separadores etc ...

así que hice esto utilizando array_walk de() de PHP que me deje unirse a una matriz asociativa en una lista de parámetros que luego podrían ser aplicadas a una etiqueta HTML ....

// Create Params Array 
$p = Array("id"=>"blar","class"=>"myclass","onclick"=>"myJavascriptFunc()"); 

// Join Params 
array_walk($p, create_function('&$i,$k','$i=" $k=\"$i\"";')); 
$p_string = implode($p,""); 

// Now use $p_string for your html tag 

Obviamente, usted podría pegarse que en su propia función de alguna manera pero te da una idea de cómo se puede unirse a una matriz asociativa utilizando su propio método. la esperanza de que ayude a alguien :)

+6

Si la sintaxis de create_function confunde a cualquiera, consulte http://php.net/manual/en/function.create-function.php –

+0

array_walk es más lento de foreach y más complicado de leer. Vea esto: http://www.reddit.com/r/PHP/comments/1uuc34/quick_test_to_see_if_array_walk_is_better_than/ – Enyby

+0

Encontré esta versión útil como la primera solución, ya que http_build_query() codifica las URL. –

-1

Ésta es la versión más básica que se me ocurre:

public function implode_key($glue = "", $pieces = array()) 
{ 
    $keys = array_keys($pieces); 
    return implode($glue, $keys); 
} 
+12

¡Eso solo implosiona las claves, no implosiona 'clave = valor' con un separador elegido! – Rikki

16

Una forma es utilizar print_r(array, true) y volverá representación de cadena de la matriz

+1

$ request_str = print_r ($ _ SOLICITUD, verdadero); // aplanar matriz para el archivo de registro – zzapper

+2

Pero eso se imprime en formato print_r, no como 'clave = valor' junto con un separador proporcionado. – Rikki

22

Si eres sin preocuparse por el formato exacto de, sin embargo, si desea algo simple pero sin los saltos de línea de print_r también puede usar json_encode($value) para obtener un resultado formateado rápido y sencillo. (Nota funciona bien en otros tipos de datos también)

$str = json_encode($arr); 
//output... 
[{"id":"123","name":"Ice"},{"id":"234","name":"Cake"},{"id":"345","name":"Pie"}] 
15

Esta es mi solución, por ejemplo, para una Div ficha atributos:

<? 

$attributes = array(
    'data-href' => 'http://example.com', 
    'data-width' => '300', 
    'data-height' => '250', 
    'data-type' => 'cover', 
); 

$dataAttributes = array_map(function($value, $key) { 
    return $key.'="'.$value.'"'; 
}, array_values($attributes), array_keys($attributes)); 

$dataAttributes = implode(' ', $dataAttributes); 

?> 

<div class="image-box" <?= $dataAttributes; ?> > 
    <img src="http://example.com/images/best-of.jpg" alt=""> 
</div> 
0
function array_to_attributes ($array_attributes) 
{ 

    $attributes_str = NULL; 
    foreach ($array_attributes as $attribute => $value) 
    { 

     $attributes_str .= " $attribute=\"$value\" "; 

    } 

    return $attributes_str; 
} 

$attributes = array(
    'data-href' => 'http://example.com', 
    'data-width' => '300', 
    'data-height' => '250', 
    'data-type' => 'cover', 
); 

echo array_to_attributes($attributes) ; 
-3
echo implode(",", array_keys($companies->toArray())); 

$companies->toArray() - esto es solo en caso de que su $variable sea un objeto; de lo contrario, pase las $ compañías.

Eso es todo!

+0

Esto solo agrega las claves a la cadena; los valores estan perdidos – FluffyKitten

0

A de una sola línea para la creación de cadena de atributos HTML (con comillas) desde una simple matriz:

$attrString = str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\""; 

Ejemplo:

$attrArray = array("id" => "email", 
        "name" => "email", 
        "type" => "email", 
        "class" => "active large"); 

echo str_replace("+", " ", str_replace("&", "\" ", str_replace("=", "=\"", http_build_query($attrArray)))) . "\""; 

// Output: 
// id="email" name="email" type="email" class="active large" 
0

¿Qué hay de este más corto, más transparente, aún más intuitivo con array_walk

$attributes = array(
    'data-href' => 'http://example.com', 
    'data-width' => '300', 
    'data-height' => '250', 
    'data-type' => 'cover', 
); 

$args = ""; 
array_walk(
    $attributes, 
    function ($item, $key) use (&$args) { 
     $args .= $key ." = '" . $item . "' "; 
    } 
); 
// output: 'data-href="http://example.com" data-width="300" data-height="250" data-type="cover" 
Cuestiones relacionadas