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

Lesezeit: 4 Minuten

Benutzer-Avatar
matpie

Ich 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, damit ich „&‘ für xhtml-Links oder ‘&‘ Andernfalls.

Meine erste Neigung ist zu verwenden foreach aber da meine Methode viele Male in einer Anfrage 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?

  • Vergessen Sie nicht, wenn Sie HTML ausgeben, ist die korrekte Syntax & nicht &, iow, das ist falsch JOE ja, es funktioniert, aber es ist ungültiges HTML.

    – TravisO

    6. Januar 2009 um 18:21 Uhr

Benutzer-Avatar
Greg

Sie können verwenden http_build_query() 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, das ist definitiv der richtige Weg. Wenn dies nicht der Fall ist, besteht die Alternative darin, eine modifizierte Implodemethode wie z uk2.php.net/manual/en/function.implode.php#84684 aber http_build_query() wird richtig schneller sein.

    – Mark Davidson

    2. Januar 2009 um 21:11 Uhr

  • Ich frage mich, ob dies wirklich der schnellste Weg für die allgemeine Frage ist. In dieser Funktion findet eine Codierung statt. Wenn es sich also nicht um eine URL handelt, ist dies wirklich schneller als array_walk und was ist, wenn Sie es nicht codiert haben möchten?

    – e-motiv

    31. Januar 2014 um 23:12 Uhr

  • das Problem ist http_build_query Escape-Sonderzeichen

    – Sisyphos

    9. Februar 2015 um 15:42 Uhr

  • Ich habe serialize(), json_encode() und http_build_query() verglichen. http_build_query() hat mit einem kleinen Vorsprung vor serialize() gewonnen, und json_encode ist bei weitem am langsamsten.

    – Ernst V

    24. Februar 2015 um 23:05 Uhr


  • Es codiert auch Sonderzeichen, daher ist dies keine gute Option

    – awavi

    10. Juni 2015 um 21:11 Uhr

Wenn Sie sich keine Sorgen um die machen genau Sie möchten jedoch etwas Einfaches formatieren, aber ohne die Zeilenumbrüche print_r kannst du auch verwenden json_encode($value) für eine schnelle und einfache formatierte Ausgabe. (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"}]

Abgesehen davon 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 gemacht, damit ich ein assoziatives Array mit einer Liste von Parametern verbinden 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 einbauen, aber es gibt Ihnen eine Vorstellung davon, wie Sie ein assoziatives Array mit Ihrer eigenen Methode verbinden können. Hoffe das hilft jemandem 🙂

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

    – Matt Fletcher

    9. September 2013 um 9:41 Uhr

  • array_walk ist langsamer von foreach und komplizierter für read. Sieh dir das an: reddit.com/r/PHP/comments/1uuc34/…

    – Enyby

    1. Dezember 2014 um 0:25 Uhr

  • Fand diese Version als erste Lösung nützlich, da http_build_query() URLs codiert.

    – Ernesto Allely

    15. April 2016 um 14:20 Uhr


Benutzer-Avatar
dino.keco

Ein Weg ist die Verwendung print_r(array, true) und es wird die Zeichenfolgendarstellung des Arrays zurückgeben

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>

Benutzer-Avatar
kostikovmu

Meine Lösung:

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

Wie wäre es mit diesem kürzeren, transparenteren und dennoch intuitiveren 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"

1358910cookie-checkDer schnellste Weg, ein assoziatives Array mit Schlüsseln zu implodieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy