La forma más rápida de implosionar una matriz asociativa con claves


114

Estoy buscando una forma rápida de convertir una matriz asociativa en una cadena. La estructura típica sería como una cadena de consulta de URL pero con separadores personalizables para que pueda usar " &" para enlaces xhtml o " &" de otra manera.

Mi primera inclinación es el uso, foreachpero dado que mi método podría ser llamado muchas veces en una sola solicitud, temo que sea 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 mas rápida?


4
No olvide que si está generando HTML, la sintaxis correcta es & amp; no &, oh, esto es incorrecto <a href="?name=joe&age=22"> JOE </a> sí, funciona pero no es HTML válido.
TravisO

Respuestas:


174

Puede utilizar http_build_query()para hacer eso.

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


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 de implosión modificado como uk2.php.net/manual/en/function.implode.php#84684 pero http_build_query () será más rápido.
Mark Davidson

Me pregunto si esta es realmente la forma más rápida de responder a la pregunta general. Hay algo de codificación en esta función. Entonces, si no es para una URL, ¿es esto realmente más rápido que array_walk y qué sucede si no lo desea codificado?
e-motiv

10
el problema es el http_build_querycarácter especial de escape
Sísifo

1
He comparado serialize (), json_encode () y http_build_query (). http_build_query () ganó por un ligero margen sobre serialize (), y json_encode fue el más lento con diferencia.
ErnestV

5
También codifica caracteres especiales, por lo que esta no es una buena opción
awavi

33

Como acotación al margen, estaba buscando encontrar la mejor manera de implosionar una matriz asociativa pero usando mis propios separadores, etc.

Así que hice esto usando la función array_walk () de PHP para permitirme unir una matriz asociativa en una lista de parámetros que luego podrían aplicarse 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, podría incluir eso en su propia función de alguna manera, pero le da una idea de cómo puede unirse a una matriz asociativa utilizando su propio método. Espero que ayude a alguien :)


6
Si la sintaxis de create_function confunde a alguien, consulte php.net/manual/en/function.create-function.php
Matt Fletcher

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

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

32

Si no le preocupa el formato exacto, sin embargo, desea algo simple pero sin los saltos de línea print_r, también puede usarlo json_encode($value)para una salida formateada rápida y simple. ( tenga en cuenta que también funciona bien en otros tipos de datos )

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

19

Esta es mi solución, por ejemplo, para atributos de datos div:

<?

$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>

18

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


1
$ request_str = print_r ($ _ REQUEST, verdadero); // aplanar la matriz para el archivo de registro
zzapper

2
Pero eso genera en el formato print_r, no como key=valueunido con un separador provisto.
Rikki

1
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) ;

1

Una línea para crear una cadena de atributos HTML (con comillas) a partir de una matriz simple:

$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"

1

Mi solución:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 

0

¿Qué pasa con esto más corto, más transparente, pero 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"

-2

Esta 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 teclas, no implosiona key=valuecon un separador elegido!
Rikki

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

$companies->toArray()- esto es solo por si su $variablees un objeto, de lo contrario, simplemente pase $ companies.

¡Eso es!


Esto solo agrega las claves a la cadena; los valores se pierden.
FluffyKitten
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.