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?


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.


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 :)


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"}]

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>

18

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


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) ;

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"

1

Meine Lösung:

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

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"

-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);
}

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!


Dadurch werden nur die Schlüssel zur Zeichenfolge hinzugefügt. Die Werte gehen verloren.
FluffyKitten
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.