Cara tercepat untuk mengimplementasikan array asosiatif dengan kunci

114

Saya mencari cara cepat untuk mengubah array asosiatif menjadi string. Struktur tipikal akan seperti string kueri URL tetapi dengan pemisah yang dapat disesuaikan sehingga saya dapat menggunakan ' &' untuk tautan xhtml atau ' &' sebaliknya.

Kecenderungan pertama saya adalah menggunakan foreachtetapi karena metode saya dapat dipanggil berkali-kali dalam satu permintaan, saya khawatir itu mungkin terlalu lambat.

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

Apakah ada cara yang lebih cepat?

matpie
sumber
4
Jangan lupa jika Anda mengeluarkan HTML, sintaks yang benar adalah & amp; tidak &, iow ini salah <a href="?name=joe&age=22"> JOE </a> ya berfungsi tetapi HTML tidak valid.
TravisO

Jawaban:

174

Anda bisa menggunakannya http_build_query()untuk melakukan itu.

Menghasilkan string kueri yang dikodekan URL dari larik asosiatif (atau terindeks) yang disediakan.

Greg
sumber
Mencoba menemukan metode ini di PHP API sendiri, ini pasti cara yang harus ditempuh. Jika tidak, alternatifnya adalah menggunakan metode implode yang dimodifikasi seperti uk2.php.net/manual/en/function.implode.php#84684 tetapi http_build_query () akan lebih cepat.
Mark Davidson
Saya ingin tahu apakah ini benar-benar cara tercepat untuk pertanyaan umum. Ada beberapa pengkodean yang terjadi dalam fungsi ini. Jadi, jika bukan karena URL, apakah ini benar-benar lebih cepat dari array_walk dan bagaimana jika Anda tidak ingin itu dikodekan?
e-motiv
10
masalahnya adalah http_build_querymelarikan diri char khusus
Sisyphus
1
Saya telah membandingkan serialize (), json_encode () dan http_build_query (). http_build_query () menang dengan selisih sedikit di atas serialize (), dan json_encode menjadi yang paling lambat sejauh ini.
ErnestV
5
Ini juga mengkodekan karakter khusus, jadi ini bukan pilihan yang baik
awavi
33

Selain itu, saya sedang mencari cara terbaik untuk meledakkan array asosiatif tetapi menggunakan pemisah saya sendiri dll ...

Jadi saya melakukan ini menggunakan fungsi array_walk () PHP untuk memungkinkan saya menggabungkan array asosiatif ke dalam daftar parameter yang kemudian dapat diterapkan ke tag 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

Jelas, Anda bisa tetap menggunakannya di fungsi Anda sendiri, tetapi itu memberi Anda gambaran tentang bagaimana Anda bisa bergabung dengan array asosiatif menggunakan metode Anda sendiri. Semoga bisa membantu seseorang :)


sumber
6
Jika sintaks dari create_function membingungkan siapa pun, lihat php.net/manual/en/function.create-function.php
Matt Fletcher
array_walk lebih lambat dari foreach dan lebih rumit untuk dibaca. Lihat ini: reddit.com/r/PHP/comments/1uuc34/…
Enyby
Menemukan versi ini berguna sebagai solusi pertama karena http_build_query () menyandikan URL.
Ernesto Allely
32

Jika Anda tidak khawatir tentang pemformatan yang tepat namun Anda menginginkan sesuatu yang sederhana tetapi tanpa jeda baris, print_rAnda juga dapat menggunakan json_encode($value)untuk hasil format yang cepat dan sederhana. ( perhatikan bahwa ini juga berfungsi dengan baik pada tipe data lain )

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

Ini adalah solusi saya misalnya untuk atribut data 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>
pengguna4846194
sumber
18

Salah satu caranya adalah dengan menggunakan print_r(array, true)dan itu akan mengembalikan representasi string dari array

dino.keco
sumber
1
$ request_str = print_r ($ _ PERMINTAAN, benar); // ratakan larik untuk file log
zzapper
2
Tapi itu menghasilkan dalam format print_r, tidak key=valuedigabungkan dengan pemisah yang disediakan.
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
sumber
1

Satu baris untuk membuat string atribut HTML (dengan tanda kutip) dari array sederhana:

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

Contoh:

$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
sumber
1

Solusi saya:

$url_string = http_build_query($your_arr);
$res = urldecode($url_string); 
kostikovmu
sumber
0

Bagaimana dengan ini yang lebih pendek, lebih transparan, namun lebih intuitif dengan 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
sumber
-2

Ini adalah versi paling dasar yang dapat saya pikirkan:

public function implode_key($glue = "", $pieces = array())
{
    $keys = array_keys($pieces);
    return implode($glue, $keys);
}
Justin
sumber
12
Itu hanya meledakkan kunci, tidak meledak key=valuedengan pemisah yang dipilih!
Rikki
-3
echo implode(",", array_keys($companies->toArray()));

$companies->toArray()- ini untuk berjaga-jaga jika Anda $variableadalah sebuah objek, jika tidak, berikan $ companies.

Itu dia!

Hardik Raval
sumber
Ini hanya menambahkan kunci ke string; nilai-nilainya hilang.
FluffyKitten