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?

matpie
la source
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.

Greg
la source
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 :)


la source
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"}]
scunliffe
la source
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>
user4846194
la source
18

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

dino.keco
la source
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) ;
Softmixt
la source
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"
WackGet
la source
1

Ma solution:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 
kostikovmu
la source
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"
FantomX1
la source
-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);
}
Justin
la source
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!

Hardik Raval
la source
Cela ajoute uniquement les clés à la chaîne; les valeurs sont perdues.
FluffyKitten