วิธีที่เร็วที่สุดในการระเบิดอาร์เรย์เชื่อมโยงด้วยคีย์


114

ฉันกำลังมองหาวิธีที่รวดเร็วในการเปลี่ยนอาร์เรย์ที่เชื่อมโยงเป็นสตริง โครงสร้างทั่วไปจะเหมือนกับสตริงการสืบค้น URL แต่มีตัวคั่นที่ปรับแต่งได้ดังนั้นฉันจึงสามารถใช้ ' &' สำหรับลิงก์ xhtml หรือ ' &' ได้

ความชอบครั้งแรกของฉันคือการใช้foreachแต่เนื่องจากวิธีการของฉันสามารถเรียกได้หลายครั้งในคำขอเดียวฉันกลัวว่ามันอาจจะช้าเกินไป

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

มีวิธีที่เร็วกว่านี้ไหม


4
อย่าลืมว่าคุณกำลังส่งออก HTML ไวยากรณ์ที่ถูกต้องคือ & amp; ไม่ใช่ &, นี่ผิด <a href="?name=joe&age=22"> JOE </a> ใช่มันใช้งานได้ แต่ HTML ไม่ถูกต้อง
TravisO

คำตอบ:


174

คุณสามารถใช้http_build_query()เพื่อทำเช่นนั้น

สร้างสตริงการสืบค้นที่เข้ารหัส URL จากอาร์เรย์ที่เชื่อมโยง (หรือจัดทำดัชนี) ที่มีให้


กำลังพยายามค้นหาวิธีนี้ใน PHP API ด้วยตัวเองนี่เป็นวิธีที่จะไป หากไม่ใช่ทางเลือกอื่นให้ใช้วิธีการระเบิดที่ปรับเปลี่ยนเช่นuk2.php.net/manual/en/function.implode.php#84684แต่ http_build_query () จะเร็วกว่าอย่างเหมาะสม
Mark Davidson

ฉันสงสัยว่านี่เป็นวิธีที่เร็วที่สุดสำหรับคำถามทั่วไปหรือไม่ มีการเข้ารหัสบางอย่างเกิดขึ้นในฟังก์ชันนี้ ดังนั้นหากไม่ใช่สำหรับ URL สิ่งนี้เร็วกว่า array_walk จริงหรือไม่และถ้าคุณไม่ต้องการเข้ารหัสล่ะ?
e-Mot

10
ปัญหาคือhttp_build_queryEscape ถ่านพิเศษ
Sisyphus

1
ฉันได้เปรียบเทียบ serialize (), json_encode () และ http_build_query () http_build_query () ชนะด้วยระยะขอบเล็กน้อยเหนือ serialize () และ json_encode ช้าที่สุด
ErnestV

5
นอกจากนี้ยังเข้ารหัสอักขระพิเศษดังนั้นนี่ไม่ใช่ตัวเลือกที่ดี
awavi

33

นอกจากนี้ฉันกำลังค้นหาวิธีที่ดีที่สุดในการระเบิดอาร์เรย์เชื่อมโยง แต่ใช้ตัวแยกของฉันเองเป็นต้น ...

ดังนั้นฉันจึงทำสิ่งนี้โดยใช้ฟังก์ชัน array_walk () ของ PHP เพื่อให้ฉันเข้าร่วมอาร์เรย์ที่เชื่อมโยงในรายการพารามิเตอร์ที่สามารถนำไปใช้กับแท็ก 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

เห็นได้ชัดว่าคุณสามารถยึดติดกับฟังก์ชันของคุณเองได้ แต่จะช่วยให้คุณทราบว่าคุณสามารถเข้าร่วมอาร์เรย์เชื่อมโยงโดยใช้วิธีการของคุณเองได้อย่างไร หวังว่าจะช่วยใครบางคน :)


6
หากไวยากรณ์ของ create_function ทำให้ใครสับสนโปรดดูที่php.net/manual/en/function.create-function.php
Matt Fletcher

array_walk ช้ากว่าจาก foreach และซับซ้อนกว่าสำหรับการอ่าน ดูสิ่งนี้: reddit.com/r/PHP/comments/1uuc34/…
Enyby

พบว่าเวอร์ชันนี้มีประโยชน์เป็นโซลูชันแรกเนื่องจาก http_build_query () เข้ารหัส URL
Ernesto Allely

32

หากคุณไม่กังวลเกี่ยวกับการจัดรูปแบบที่แน่นอนแต่คุณต้องการสิ่งที่เรียบง่าย แต่ไม่มีการแบ่งบรรทัดprint_rคุณยังสามารถใช้json_encode($value)สำหรับเอาต์พุตที่จัดรูปแบบได้อย่างรวดเร็วและเรียบง่าย ( โปรดทราบว่ามันทำงานได้ดีกับประเภทข้อมูลอื่น ๆ ด้วย )

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

19

นี่คือวิธีการแก้ปัญหาของฉันสำหรับตัวอย่างข้อมูล div-attributes:

<?

$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

วิธีหนึ่งคือใช้print_r(array, true)และจะส่งคืนการแสดงสตริงของอาร์เรย์


1
$ request_str = print_r ($ _ REQUEST จริง); //
แฟล็ต

2
แต่ผลลัพธ์นั้นจะอยู่ในรูปแบบ print_r ไม่ใช่key=valueรวมกับตัวคั่นที่ให้มา
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

บรรทัดเดียวสำหรับสร้างสตริงของแอตทริบิวต์ HTML (พร้อมเครื่องหมายคำพูด) จากอาร์เรย์ธรรมดา:

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

ตัวอย่าง:

$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"


0

สิ่งที่สั้นกว่าโปร่งใสกว่า แต่ใช้งานง่ายกว่าด้วย 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

นี่เป็นเวอร์ชันพื้นฐานที่สุดที่ฉันนึกออก:

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

12
นั่นคือการระเบิดกุญแจเท่านั้นมันไม่ระเบิดkey=valueด้วยตัวคั่นที่เลือก!
Rikki

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

$companies->toArray()- นี่เป็นเพียงในกรณีที่คุณ$variableเป็นวัตถุหรือเพียงแค่ส่งต่อ บริษัท $

แค่นั้นแหละ!


เพิ่มคีย์ให้กับสตริงเท่านั้น ค่าจะหายไป
FluffyKitten
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.