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?


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.


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 :)


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"}]

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>

18

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


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) ;

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"

1

Solusi saya:

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

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"

-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);
}

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!


Ini hanya menambahkan kunci ke string; nilai-nilainya hilang.
FluffyKitten
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.