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

4 minutos de lectura

avatar de usuario
matpie

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 lo contrario.

Mi primera inclinación es usar foreach pero dado que mi método podría llamarse muchas veces en una 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 mas rápida?

  • No olvide que si está generando HTML, la sintaxis correcta es & no &, ahora esto está mal JOE sí, funciona pero no es HTML válido.

    – TravisO

    6 de enero de 2009 a las 18:21

avatar de usuario
greg

Puedes usar 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 utilizar un método de implosión modificado como uk2.php.net/manual/en/function.implode.php#84684 pero http_build_query() será correctamente más rápido.

    –Mark Davidson

    2 de enero de 2009 a las 21:11

  • Me pregunto si esta es realmente la forma más rápida para 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 quiere codificado?

    – e-motivo

    31 de enero de 2014 a las 23:12

  • el problema es http_build_query escape char especial

    – Sísifo

    9 de febrero de 2015 a las 15:42

  • 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.

    – Ernest V

    24 de febrero de 2015 a las 23:05


  • También codifica caracteres especiales, por lo que no es una buena opción.

    – awavi

    10 de junio de 2015 a las 21:11

Si no te preocupa el exacto formato sin embargo, desea algo simple pero sin los saltos de línea de print_r también puedes usar json_encode($value) para una salida formateada rápida y sencilla. (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"}]

Aparte, estaba buscando 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 🙂

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

    –Matt Fletcher

    9 de septiembre de 2013 a las 9:41

  • array_walk es más lento desde foreach y más complicado para leer. Mira esto: reddit.com/r/PHP/comments/1uuc34/…

    – Enyby

    1 de diciembre de 2014 a las 0:25

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

    – Ernesto Alley

    15/04/2016 a las 14:20


avatar de usuario
dino.keco

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

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>

avatar de usuario
kostikovmu

Mi solución:

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

¿Qué pasa con este 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"

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad