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?

matpie
źródło
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).

Greg
źródło
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 :)


źródło
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"}]
scunliffe
źródło
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>
user4846194
źródło
18

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

dino.keco
źródło
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) ;
Softmixt
źródło
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"
WackGet
źródło
1

Moje rozwiązanie:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 
kostikovmu
źródło
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"
FantomX1
źródło
-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);
}
Justin
źródło
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!

Hardik Raval
źródło
To tylko dodaje klucze do łańcucha; wartości są tracone.
FluffyKitten