Cách nhanh nhất để mã hóa một mảng kết hợp với các khóa


114

Tôi đang tìm một cách nhanh chóng để chuyển một mảng kết hợp thành một chuỗi. Cấu trúc điển hình sẽ giống như một chuỗi truy vấn URL nhưng có dấu phân tách có thể tùy chỉnh để tôi có thể sử dụng ' &' cho các liên kết xhtml hoặc ' &' nếu không.

Xu hướng đầu tiên của tôi là sử dụng foreachnhưng vì phương pháp của tôi có thể được gọi nhiều lần trong một yêu cầu nên tôi sợ nó có thể quá chậm.

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

Có cách nào nhanh hơn không?


4
Đừng quên nếu bạn đang xuất HTML, thì cú pháp đúng là & amp; không &, điều này là sai <a href="?name=joe&age=22"> JOE </a> vâng nó hoạt động nhưng nó là HTML không hợp lệ.
TravisO

Câu trả lời:


174

Bạn có thể sử dụng http_build_query()để làm điều đó.

Tạo chuỗi truy vấn được mã hóa URL từ mảng liên kết (hoặc được lập chỉ mục) được cung cấp.


Bản thân tôi đã cố gắng tìm phương pháp này trong API PHP, đây chắc chắn là cách tốt nhất. Nếu không, cách thay thế là sử dụng phương thức mã hóa đã sửa đổi, chẳng hạn như uk2.php.net/manual/en/ Chức năng.implode.php#84684 nhưng http_build_query () đúng cách sẽ nhanh hơn.
Mark Davidson

Tôi tự hỏi liệu đây có thực sự là cách nhanh nhất cho câu hỏi chung không. Có một số mã hóa đang diễn ra trong chức năng này. Vì vậy, nếu nó không dành cho URL, thì điều này có thực sự nhanh hơn array_walk và nếu bạn không muốn nó được mã hóa thì sao?
e-motiv

10
vấn đề là http_build_querythoát char đặc biệt
Sisyphus

1
Tôi đã so sánh serialize (), json_encode () và http_build_query (). http_build_query () đã thắng một chút so với serialize () và json_encode là chậm nhất cho đến nay.
ErnestV

5
Nó cũng mã hóa ký tự đặc biệt, vì vậy đây không phải là một lựa chọn tốt
awavi

33

Ngoài ra, tôi đang tìm kiếm cách tốt nhất để giải mã một mảng liên kết nhưng sử dụng trình tách riêng của mình, v.v.

Vì vậy, tôi đã thực hiện việc này bằng cách sử dụng hàm array_walk () của PHP để cho phép tôi nối một mảng liên kết vào danh sách các tham số sau đó có thể được áp dụng cho thẻ 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

Rõ ràng, bạn có thể gắn nó vào hàm của riêng mình bằng cách nào đó nhưng nó cho bạn ý tưởng về cách bạn có thể tham gia một mảng kết hợp bằng cách sử dụng phương thức của riêng bạn. Hy vọng rằng sẽ giúp ai đó :)


6
Nếu cú pháp của create_function là khó hiểu bất cứ ai, xem php.net/manual/en/function.create-function.php
Matt Fletcher

array_walk chậm hơn so với foreach và phức tạp hơn để đọc. Xem cái này: reddit.com/r/PHP/comments/1uuc34/…
Enyby

Tìm thấy phiên bản này hữu ích như là giải pháp đầu tiên khi http_build_query () mã hóa URL.
Ernesto Allely

32

Nếu bạn không quan tâm đến định dạng chính xác, tuy nhiên bạn muốn một cái gì đó đơn giản nhưng không có ngắt dòng, print_rbạn cũng có thể sử dụng json_encode($value)để có đầu ra được định dạng nhanh chóng và đơn giản. ( lưu ý rằng nó cũng hoạt động tốt trên các loại dữ liệu khác )

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

19

Đây là giải pháp của tôi, ví dụ cho một thuộc tính dữ liệu 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

Một cách đang sử dụng print_r(array, true)và nó sẽ trả về biểu diễn chuỗi của mảng


1
$ request_str = print_r ($ _ REQUEST, true); // mảng flatten cho log file
zzapper

2
Nhưng kết quả đầu ra ở định dạng print_r, không được key=valuekết hợp với dấu phân tách được cung cấp.
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

Một lớp lót để tạo chuỗi thuộc tính HTML (có dấu ngoặc kép) từ một mảng đơn giản:

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

Thí dụ:

$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

Giải pháp của tôi:

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

0

Còn về điều này ngắn hơn, minh bạch hơn nhưng trực quan hơn với 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

Đây là phiên bản cơ bản nhất mà tôi có thể nghĩ ra:

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

12
Điều đó chỉ giải mã các khóa, nó không kích hoạt key=valuevới một dấu phân cách đã chọn!
Rikki

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

$companies->toArray()- điều này chỉ đề phòng nếu bạn $variablelà đối tượng, nếu không thì chỉ cần vượt qua $ công ty.

Đó là nó!


Điều này chỉ thêm các phím vào chuỗi; các giá trị bị mất.
FluffyKitten
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.