2009-01-02 19 views
93

Ich bin auf der Suche nach einer schnellen Möglichkeit, ein assoziatives Array in eine Zeichenfolge umzuwandeln. Eine typische Struktur wäre wie eine URL-Abfragezeichenfolge, aber mit anpassbaren Trennzeichen, so dass ich '&' für xhtml-Links oder '&' verwenden kann.Schnellste Möglichkeit, ein assoziatives Array mit Schlüsseln zu implodieren

Meine erste Neigung ist es, foreach zu verwenden, aber da meine Methode in einer Anfrage oft aufgerufen werden konnte, 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, ist die korrekte Syntax & nicht &, was falsch ist JOE ja es funktioniert, aber es ist ungültig HTML. – TravisO

Antwort

143

Sie können dazu http_build_query() verwenden.

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

+0

Wurde versucht, diese Methode in der PHP API selbst zu finden, ist dies definitiv der Weg zu gehen. Wenn nicht, ist die Alternative, eine modifizierte Implod-Methode wie http://uk2.php.net/manual/en/function.implode.php#84684 zu verwenden, aber http_build_query() wird korrekt schneller sein. –

+0

Ich frage mich, ob das wirklich der schnellste Weg für die allgemeine Frage ist. In dieser Funktion wird eine Codierung durchgeführt. Also, wenn es nicht für eine URL ist, ist das wirklich schneller als array_walk und was ist, wenn du es nicht codiert haben willst? –

+5

Das Problem ist 'http_build_query' Escape-Sonderzeichen – Sisyphus

32

Als beiseite, ich war auf der Suche, den besten Weg zu finden, ein assoziatives Array implodieren, aber meine eigenen seperators etc mit ...

So habe ich das PHP array_walk() -Funktion, lassen mich ein assoziatives Array in eine Liste von Parametern verbinden, die dann zu einem HTML-Tag angewendet werden könnte ....

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

Offensichtlich könnten Sie das in Ihrer eigenen Funktion bleiben irgendwie, aber es gibt Ihnen eine Vorstellung davon, wie können Sie Verbinden Sie ein assoziatives Array mit Ihrer eigenen Methode. Hoffnung, dass jemand hilft :)

+6

Wenn die Syntax von create_function jemanden verwirrt, siehe http://php.net/manual/en/function.create-function.php –

+0

array_walk ist langsamer von foreach und komplizierter zum Lesen. Siehe hierzu: http://www.reddit.com/r/PHP/comments/1uuc34/quick_test_to_see_if_array_walk_is_better_than/ – Enyby

+0

Diese Version ist als erste Lösung nützlich, da http_build_query() URLs codiert. –

-1

Dies ist die einfachste Version, die ich denken 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 "Schlüssel = Wert" mit einem gewählten Trennzeichen! – Rikki

16

Eine Möglichkeit ist print_r(array, true) mit und es wird String-Darstellung von Array

+1

$ request_str = print_r ($ _ REQUEST, true); // flattern Array für Log-Datei – zzapper

+2

Aber das gibt im print_r-Format, nicht als 'Schlüssel = Wert 'verbunden mit einem mitgelieferten Trennzeichen. – Rikki

22

zurückkehren Wenn Sie nicht besorgt über die genaue Formatierung aber Sie wollen etwas einfaches, aber ohne die Zeilenumbrüche print_r können Sie auch json_encode($value) für eine schnelle und einfache formatierte Ausgabe verwenden. (Note funktioniert sich gut auf anderen Datentypen zu)

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

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

<? 

$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> 
0
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) ; 
-3
echo implode(",", array_keys($companies->toArray())); 

$companies->toArray() - Dies ist nur für den Fall, wenn Ihr $variable ein Objekt ist, ansonsten einfach $ Unternehmen übergeben.

Das war's!

+0

Dies fügt nur die Schlüssel der Zeichenfolge hinzu; Die Werte sind verloren. – FluffyKitten

0

A one-liner Zeichenkette von HTML-Attribute (mit Anführungszeichen) von einer einfachen Anordnung zum Erstellen:

$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" 
0

Was diese kürzeren, transparent, noch intuitiven mit 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"