Le moyen le plus rapide d'imploser un tableau associatif avec des clés


114

Je recherche un moyen rapide de transformer un tableau associatif en une chaîne. La structure typique serait comme une chaîne de requête URL mais avec des séparateurs personnalisables afin que je puisse utiliser « &» pour les liens xhtml ou « &» autrement.

Ma première inclination est d'utiliser, foreachmais comme ma méthode peut être appelée plusieurs fois en une seule demande, je crains qu'elle ne soit trop lente.

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

Y at-il un moyen plus rapide?


4
N'oubliez pas si vous produisez du HTML, la syntaxe correcte est & amp; non &, iow c'est faux <a href="?name=joe&age=22"> JOE </a> oui ça marche mais c'est du HTML invalide.
TravisO

Réponses:


174

Vous pouvez utiliser http_build_query()pour le faire.

Génère une chaîne de requête encodée en URL à partir du tableau associatif (ou indexé) fourni.


J'essayais moi-même de trouver cette méthode dans l'API PHP, c'est certainement la voie à suivre. Sinon, l'alternative est d'utiliser une méthode d' implodification modifiée telle que uk2.php.net/manual/en/function.implode.php#84684 mais http_build_query () sera correctement plus rapide.
Mark Davidson

Je me demande si c'est vraiment le moyen le plus rapide pour la question générale. Il y a du codage en cours dans cette fonction. Donc, si ce n'est pas pour une URL, est-ce vraiment plus rapide que array_walk et que faire si vous ne voulez pas qu'il soit encodé?
e-motiv

10
le problème est http_build_queryéchapper au caractère spécial
Sisyphe

1
J'ai comparé serialize (), json_encode () et http_build_query (). http_build_query () a gagné par une légère marge sur serialize (), et json_encode étant de loin le plus lent.
ErnestV

5
Il encode également des caractères spéciaux, donc ce n'est pas une bonne option
awavi

33

En passant, j'étais à la recherche du meilleur moyen d'imploser un tableau associatif mais en utilisant mes propres séparateurs etc ...

J'ai donc fait cela en utilisant la fonction array_walk () de PHP pour me permettre de joindre un tableau associatif dans une liste de paramètres qui pourraient ensuite être appliqués à une balise 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

Évidemment, vous pouvez coller cela dans votre propre fonction, mais cela vous donne une idée de la manière dont vous pouvez joindre un tableau associatif en utilisant votre propre méthode. J'espère que cela aide quelqu'un :)


6
Si la syntaxe de create_function déroute n'importe qui, voir php.net/manual/en/function.create-function.php
Matt Fletcher

array_walk est plus lent de foreach et plus compliqué à lire. Voir ceci: reddit.com/r/PHP/comments/1uuc34/…
Enyby

J'ai trouvé cette version utile comme première solution car http_build_query () encode les URL.
Ernesto Allely

32

Si vous n'êtes pas préoccupé par le formatage exact, vous voulez quelque chose de simple, mais sans les sauts de ligne, print_rvous pouvez également l'utiliser json_encode($value)pour une sortie formatée rapide et simple. ( notez que cela fonctionne bien sur d'autres types de données aussi )

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

19

C'est ma solution par exemple pour un div data-attributes:

<?

$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

Une façon est d'utiliser print_r(array, true)et il retournera une représentation sous forme de chaîne du tableau


1
$ request_str = print_r ($ _ REQUEST, vrai); // aplatir le tableau pour le fichier journal
zzapper

2
Mais cela sort au format print_r, pas comme key=valuejoint avec un séparateur fourni.
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

Une ligne pour créer une chaîne d'attributs HTML (avec guillemets) à partir d'un simple tableau:

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

Exemple:

$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

Ma solution:

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

0

Qu'en est-il de ce plus court, plus transparent, mais plus intuitif avec 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

C'est la version la plus basique à laquelle je puisse penser:

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

12
Cela implose seulement les clés, cela n'implose pas key=valueavec un séparateur choisi!
Rikki

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

$companies->toArray()- c'est juste au cas où si vous $variableêtes un objet, sinon il suffit de passer $ companies.

C'est tout!


Cela ajoute uniquement les clés à la chaîne; les valeurs sont perdues.
FluffyKitten
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.