Der schnellste Weg, ein assoziatives Array mit Schlüsseln zu implodieren

114

Ich suche nach einer schnellen Möglichkeit, ein assoziatives Array in einen String umzuwandeln. Eine typische Struktur wäre wie eine URL- &Abfragezeichenfolge, jedoch mit anpassbaren Trennzeichen, sodass ich ' ' für XML-Links oder ' &' auf andere Weise verwenden kann.

Meine erste Neigung ist es, zu verwenden, foreachaber da meine Methode in einer Anfrage mehrmals aufgerufen werden könnte, befürchte ich, dass sie zu langsam sein könnte.

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

Gibt es einen schnelleren Weg?

Matpie
quelle
4
Vergessen Sie nicht, wenn Sie HTML ausgeben, lautet die korrekte Syntax & amp; nicht &, aber das ist falsch <a href="?name=joe&age=22"> JOE </a> Ja, es funktioniert, aber es ist ungültiges HTML.
TravisO

Antworten:

174

Sie können das verwenden http_build_query(), um das zu tun.

Generiert eine URL-codierte Abfragezeichenfolge aus dem bereitgestellten assoziativen (oder indizierten) Array.

Greg
quelle
Ich habe versucht, diese Methode in der PHP-API selbst zu finden. Dies ist definitiv der richtige Weg. Wenn nicht, besteht die Alternative darin, eine modifizierte implodierende Methode wie uk2.php.net/manual/en/function.implode.php#84684 zu verwenden, aber http_build_query () ist ordnungsgemäß schneller.
Mark Davidson
Ich frage mich, ob dies wirklich der schnellste Weg für die allgemeine Frage ist. In dieser Funktion wird eine Codierung ausgeführt. Wenn es sich also nicht um eine URL handelt, ist diese wirklich schneller als array_walk und was ist, wenn Sie nicht möchten, dass sie codiert wird?
E-Motiv
10
Das Problem ist http_build_queryEscape Special Char
Sisyphus
1
Ich habe serialize (), json_encode () und http_build_query () verglichen. http_build_query () gewann mit einem kleinen Vorsprung gegenüber serialize (), und json_encode ist mit Abstand der langsamste.
ErnestV
5
Es codiert auch Sonderzeichen, daher ist dies keine gute Option
awavi
33

Nebenbei war ich auf der Suche nach dem besten Weg, ein assoziatives Array zu implodieren, aber mit meinen eigenen Trennzeichen usw.

Also habe ich dies mit der Funktion array_walk () von PHP getan, damit ich ein assoziatives Array zu einer Liste von Parametern zusammenfügen kann, die dann auf ein HTML-Tag angewendet werden können.

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

Natürlich könnten Sie das irgendwie in Ihre eigene Funktion einfügen, aber es gibt Ihnen eine Vorstellung davon, wie Sie mit Ihrer eigenen Methode einem assoziativen Array beitreten können. Hoffe das hilft jemandem :)


quelle
6
Wenn die Syntax von create_function jemanden verwirrt, siehe php.net/manual/en/function.create-function.php
Matt Fletcher
array_walk ist von foreach langsamer und für das Lesen komplizierter. Siehe dies: reddit.com/r/PHP/comments/1uuc34/…
Enyby
Diese Version war als erste Lösung nützlich, da http_build_query () URLs codiert.
Ernesto Allely
32

Wenn Sie sich nicht um die genaue Formatierung kümmern , möchten Sie jedoch etwas Einfaches, aber ohne die Zeilenumbrüche können print_rSie auch json_encode($value)eine schnelle und einfache formatierte Ausgabe verwenden. ( Beachten Sie, dass es auch bei anderen Datentypen gut funktioniert. )

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

Dies ist meine Lösung zum Beispiel für ein div-Datenattribut:

<?

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

Eine Möglichkeit ist die Verwendung von print_r(array, true)und es wird eine Zeichenfolgendarstellung des Arrays zurückgegeben

dino.keco
quelle
1
$ request_str = print_r ($ _ REQUEST, true); // Array für Protokolldatei
reduzieren
2
Dies wird jedoch im print_r-Format ausgegeben, nicht wie key=valuemit einem mitgelieferten Trennzeichen verbunden.
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
quelle
1

Ein Einzeiler zum Erstellen einer Zeichenfolge von HTML-Attributen (mit Anführungszeichen) aus einem einfachen Array:

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

Beispiel:

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

Meine Lösung:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 
kostikovmu
quelle
0

Was ist mit diesem kürzeren, transparenteren und dennoch intuitiveren 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
quelle
-2

Dies ist die grundlegendste Version, die ich mir vorstellen kann:

public function implode_key($glue = "", $pieces = array())
{
    $keys = array_keys($pieces);
    return implode($glue, $keys);
}
Justin
quelle
12
Das implodiert nur die Schlüssel, es implodiert nicht key=valuemit einem gewählten Trennzeichen!
Rikki
-3
echo implode(",", array_keys($companies->toArray()));

$companies->toArray()- Dies ist nur für den Fall, dass Sie $variableein Objekt sind, andernfalls übergeben Sie einfach $ Unternehmen.

Das ist es!

Hardik Raval
quelle
Dadurch werden nur die Schlüssel zur Zeichenfolge hinzugefügt. Die Werte gehen verloren.
FluffyKitten