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.