Il modo più veloce per implodere un array associativo con chiavi


114

Sto cercando un modo veloce per trasformare un array associativo in una stringa. La struttura tipica sarebbe come una stringa di query dell'URL ma con separatori personalizzabili in modo da poter utilizzare " &" per i collegamenti xhtml o " &" in altro modo.

La mia prima inclinazione è quella di usare, foreachma poiché il mio metodo potrebbe essere chiamato molte volte in una richiesta, temo che potrebbe essere troppo lento.

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

C'è un modo più veloce?


4
Non dimenticare che se stai trasmettendo HTML, la sintassi corretta è & amp; no &, iow è sbagliato <a href="?name=joe&age=22"> JOE </a> sì, funziona ma è HTML non valido.
TravisO

Risposte:


174

Puoi usare http_build_query()per farlo.

Genera una stringa di query con codifica URL dall'array associativo (o indicizzato) fornito.


Stavo cercando di trovare questo metodo nell'API PHP da solo, questa è sicuramente la strada da percorrere. In caso contrario, l'alternativa è utilizzare un metodo di implode modificato come uk2.php.net/manual/en/function.implode.php#84684 ma http_build_query () sarà correttamente più veloce.
Mark Davidson

Mi chiedo se questo sia davvero il modo più veloce per la domanda generale. C'è qualche codifica in corso in questa funzione. Quindi, se non è per un URL, è davvero più veloce di array_walk e cosa succede se non lo vuoi codificato?
e-motiv

10
il problema è il http_build_querycarattere speciale di fuga
Sisyphus

1
Ho confrontato serialize (), json_encode () e http_build_query (). http_build_query () ha vinto con un leggero margine su serialize () e json_encode è di gran lunga il più lento.
ErnestV

5
Codifica anche caratteri speciali, quindi questa non è una buona opzione
awavi il

33

Per inciso, stavo cercando il modo migliore per implodere un array associativo ma usando i miei separatori ecc ...

Quindi l'ho fatto utilizzando la funzione array_walk () di PHP per consentirmi di unire un array associativo in un elenco di parametri che potrebbero quindi essere applicati a un tag 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

Ovviamente, potresti in qualche modo inserirlo nella tua funzione, ma ti dà un'idea di come puoi unire un array associativo usando il tuo metodo. Spero che aiuti qualcuno :)


6
Se la sintassi di create_function confonde qualcuno, vedere php.net/manual/en/function.create-function.php
Matt Fletcher

array_walk è più lento da foreach e più complicato da leggere. Vedi questo: reddit.com/r/PHP/comments/1uuc34/…
Enyby

Ho trovato questa versione utile come prima soluzione poiché http_build_query () codifica gli URL.
Ernesto Allely

32

Se non sei preoccupato per la formattazione esatta, tuttavia, vuoi qualcosa di semplice ma senza le interruzioni di riga print_rpuoi anche usarlo json_encode($value)per un output formattato semplice e veloce. ( nota che funziona bene anche su altri tipi di dati )

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

19

Questa è la mia soluzione ad esempio per 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

Un modo è usare print_r(array, true)e restituirà la rappresentazione di stringa dell'array


1
$ request_str = print_r ($ _ RICHIESTA, true); // appiattire l'array per il file di registro
zzapper

2
Ma questo viene visualizzato nel formato print_r, non come key=valueunito a un separatore fornito.
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 riga per creare una stringa di attributi HTML (con virgolette) da un semplice array:

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

Esempio:

$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

La mia soluzione:

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

0

Che dire di questo più breve, più trasparente, ma più 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

Questa è la versione più semplice a cui riesco a pensare:

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

12
Questo fa implodere solo le chiavi, non implode key=valuecon un separatore scelto!
Rikki

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

$companies->toArray()- questo è solo nel caso in cui il tuo $variableè un oggetto, altrimenti passa solo $ aziende.

Questo è tutto!


Questo aggiunge solo le chiavi alla stringa; i valori vengono persi.
FluffyKitten
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.