Najszybszy sposób na implodowanie tablicy asocjacyjnej z kluczami


114

Szukam szybkiego sposobu, aby zamienić tablicę asocjacyjną w ciąg. Typowa struktura jest podobna do ciągu zapytania URL, ale z konfigurowalnymi separatorami, więc mogę użyć „ &” dla linków xhtml lub „ &” w inny sposób.

Moją pierwszą skłonnością jest użycie, foreachale ponieważ moja metoda mogłaby zostać wywołana wiele razy w jednym żądaniu, obawiam się, że może być zbyt wolna.

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

Czy jest szybszy sposób?


4
Nie zapomnij, jeśli generujesz HTML, prawidłowa składnia to & amp; nie &, iow to jest źle <a href="?name=joe&age=22"> JOE </a> tak, działa, ale to jest nieprawidłowy HTML.
TravisO

Odpowiedzi:


174

Możesz http_build_query()to zrobić.

Generuje ciąg zapytania zakodowany w adresie URL z podanej tablicy asocjacyjnej (lub indeksowanej).


Próbowałem sam znaleźć tę metodę w PHP API, to zdecydowanie jest droga. Jeśli nie, alternatywą jest użycie zmodyfikowanej metody implode, takiej jak uk2.php.net/manual/en/function.implode.php#84684, ale metoda http_build_query () będzie działać szybciej.
Mark Davidson

Zastanawiam się, czy to naprawdę najszybszy sposób na ogólne pytanie. W tej funkcji zachodzi pewne kodowanie. Tak więc, jeśli nie jest to adres URL, czy jest to naprawdę szybsze niż array_walk, a co, jeśli nie chcesz, aby był zakodowany?
e-motiv

10
problemem jest http_build_queryucieczka przed specjalnym charakterem
Syzyf

1
Porównałem serialize (), json_encode () i http_build_query (). http_build_query () wygrał z niewielkim marginesem w stosunku do serialize (), a json_encode jest zdecydowanie najwolniejszy.
ErnestV

5
Koduje również znaki specjalne, więc nie jest to dobra opcja
awavi

33

Nawiasem mówiąc, szukałem najlepszego sposobu na implodowanie tablicy asocjacyjnej, ale używając własnych separatorów itp.

Zrobiłem to za pomocą funkcji PHP array_walk (), aby umożliwić mi dołączenie tablicy asocjacyjnej do listy parametrów, które można następnie zastosować do znacznika 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

Oczywiście możesz to w jakiś sposób umieścić we własnej funkcji, ale daje ci to wyobrażenie o tym, jak możesz dołączyć do tablicy asocjacyjnej przy użyciu własnej metody. Mam nadzieję, że to komuś pomoże :)


6
Jeśli składnia funkcji create_function kogoś wprawia w
Matt Fletcher

array_walk jest wolniejszy od foreach i bardziej skomplikowany do odczytu. Zobacz: reddit.com/r/PHP/comments/1uuc34/…
Enyby,

Okazało się, że ta wersja jest przydatna jako pierwsze rozwiązanie, ponieważ http_build_query () koduje adresy URL.
Ernesto Allely

32

Jeśli nie martwisz się dokładnym formatowaniem, potrzebujesz czegoś prostego, ale bez podziałów wiersza print_r, możesz również użyć json_encode($value)do szybkiego i prostego sformatowanego wyjścia. ( zauważ, że działa dobrze również w przypadku innych typów danych )

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

19

Oto moje rozwiązanie, na przykład dla atrybutów danych div:

<?

$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

Jednym ze sposobów jest użycie print_r(array, true)i zwróci łańcuch reprezentujący tablicę


1
$ request_str = print_r ($ _ ŻĄDANIE, prawda); // spłaszcz tablicę dla pliku dziennika
zzapper,

2
Ale to wyprowadza w formacie print_r, a nie w key=valuepołączeniu z dostarczonym separatorem.
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

Jednowierszowy do tworzenia ciągu atrybutów HTML (z cudzysłowami) z prostej tablicy:

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

Przykład:

$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

Moje rozwiązanie:

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

0

A co z tym krótszym, bardziej przejrzystym, a jednocześnie bardziej intuicyjnym z 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

To najbardziej podstawowa wersja, jaką przychodzi mi do głowy:

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

12
To tylko imploduje klucze, nie imploduje key=valuez wybranym separatorem!
Rikki

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

$companies->toArray()- jest to na wszelki wypadek, jeśli twój $variablejest obiektem, w przeciwnym razie po prostu przekaż $ firm.

Otóż ​​to!


To tylko dodaje klucze do łańcucha; wartości są tracone.
FluffyKitten
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.