การส่งอาร์เรย์เป็นพารามิเตอร์ url


115

วิธีใดเป็นวิธีที่ดีที่สุดในการส่งอาร์เรย์เป็นพารามิเตอร์ url ฉันคิดว่าถ้าเป็นไปได้:

$aValues = array();

$url = 'http://www.example.com?aParam='.$aValues;

หรืออย่างไร:

$url = 'http://www.example.com?aParam[]='.$aValues;

ฉันอ่านตัวอย่างแล้ว แต่ฉันคิดว่ามันยุ่ง:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';

2
ทำไมคุณถึงผ่านเข้าไป$_POSTไม่ได้?
สุ่ม

นี่ดูยุ่งจริงๆ แต่สำหรับแนวทางนั้นจะต้องมี วิธีการอื่น ๆ , query = array('aParam'=> json_encode($arrayOfValues))ซับซ้อนเล็กน้อยคือการกำหนด และการที่คุณสามารถส่งผ่านใน URL url_encode(implode('/',$query))ที่ดีกว่าด้วย URL จะมีลักษณะwww.example.com/aParam/[va1,val2,...]ดังนี้ เมื่อได้รับคุณต้อง json_decode aParam ค่าลงในอาร์เรย์
Vladimir Vukanac

คำตอบ:


220

มีวิธีแก้ปัญหาที่ง่ายมาก: http_build_query(). ใช้พารามิเตอร์การสืบค้นของคุณเป็นอาร์เรย์ที่เชื่อมโยง:

$data = array(
    1,
    4,
    'a' => 'b',
    'c' => 'd'
);
$query = http_build_query(array('aParam' => $data));

จะกลับมา

string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d"

http_build_query()จับทั้งหมดหนีจำเป็นสำหรับคุณ ( %5B=> [และ%5D=> ]) aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=dดังนั้นสายนี้จะมีค่าเท่ากับ


16
หากคุณกำลังสงสัยว่าจะได้รับกลับมานี้เป็นอาร์เรย์คำตอบคือparse_str ()
ผิด

1
ฉันใช้สิ่งนี้เพื่อใส่ url ในอาร์เรย์ แต่ไม่รู้วิธีรับข้อมูลคืน ฉันลอง parse_str แล้วไม่สามารถใช้งานได้ ฉันคิดว่านี่จะเป็นข้อมูลที่มีค่า
Thomas Williams

2
สำหรับใครก็ตามที่ประสบปัญหาในการhttp_build_queryกลับมาparam[]และparam[index]บางครั้ง ดูโพสต์นี้: stackoverflow.com/questions/11996573/…
stwhite

2
เพื่อรับคืนค่าที่คุณมีเป็น $ data = $ _GET ['aParam'];
dfortun

@dfortun การกลับมาเป็นสิ่งสำคัญที่คุณประหยัดเวลาได้มาก parse_str () ไม่ได้ผลสำหรับฉัน แต่ $ data = $ _GET ['aParam']; เป็นทางออกที่ถูกต้อง
Asesha George

56

แก้ไข:อย่าพลาดโซลูชันของ Stefan ด้านบนซึ่งใช้http_build_query()ฟังก์ชันที่มีประโยชน์มาก: https://stackoverflow.com/a/1764199/179125

knittl พูดถูกเกี่ยวกับการหลบหนี อย่างไรก็ตามมีวิธีที่ง่ายกว่านี้:

$url = 'http://example.com/index.php?';
$url .= 'aValues[]=' . implode('&aValues[]=', array_map('urlencode', $aValues));

หากคุณต้องการทำสิ่งนี้กับอาร์เรย์ที่เชื่อมโยงให้ลองทำสิ่งนี้แทน:

PHP 5.3+ (ฟังก์ชันแลมบ์ดา)

$url = 'http://example.com/index.php?';
$url .= implode('&', array_map(function($key, $val) {
    return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
  },
  array_keys($aValues), $aValues)
);

PHP <5.3 (โทรกลับ)

function urlify($key, $val) {
  return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
}

$url = 'http://example.com/index.php?';
$url .= implode('&amp;', array_map('urlify', array_keys($aValues), $aValues));

1
เรียบร้อย! จะดีมากถ้ามันสามารถทำงานร่วมกับอาร์เรย์ที่เชื่อมโยงได้ด้วย +1 ต่อไป
knittl

3
knittl: เราสามารถทำได้ด้วยฟังก์ชันเรียกกลับไปยัง array_map และส่งผ่านคีย์และค่าแยกกัน ลองดูสิ
Jordan Running

แต่อาจยังเกินขนาดสูงสุดของพารามิเตอร์ GET ได้ใช่ไหม จะเป็นอย่างไรหากฉันใช้เซสชันแทนเช่นเดียวกับ nash ที่ระบุไว้ด้านล่าง
uji

คุณสามารถจัดเก็บข้อมูลได้ไม่ จำกัด จำนวนมากหรือน้อยในหนึ่งเซสชัน ความเสี่ยงที่เกิดจากเซสชันอยู่ใน URL ที่หมดเมื่อเซสชันหมดอายุหรือหากผู้ใช้พยายามทำสิ่งต่างๆเช่นในสองแท็บพร้อมกัน หากผู้ใช้บุ๊กมาร์กเพจแล้วกลับมาหลังจากเซสชันหมดลงผู้ใช้จะยังคงได้รับหน้าที่คาดหวังหรือไม่ ดูเหมือนว่าคุณอาจต้องคิดมากขึ้นเกี่ยวกับสถาปัตยกรรมของคุณและเหตุใดคุณจึงต้องผ่านอาร์เรย์ขนาดใหญ่เช่นนี้ในตอนแรก
Jordan Running

+1 คำตอบที่ดีและทำงานให้ฉันหลังจากโพสต์คำตอบนี้หนึ่งปี
Naveed

10

วิธีที่ง่ายที่สุดคือการใช้serializeฟังก์ชัน

มันทำให้ตัวแปรเป็นอนุกรมสำหรับการจัดเก็บหรือถ่ายโอน คุณสามารถอ่านเกี่ยวกับเรื่องนี้ได้ในคู่มือ php - serialize

ตัวแปรสามารถเรียกคืนได้โดยใช้ unserialize

ดังนั้นในการส่งไปยัง URL ที่คุณใช้:

$url = urlencode(serialize($array))

และเรียกคืนตัวแปรที่คุณใช้

$var = unserialize(urldecode($_GET['array']))

ระวังตรงนี้ด้วย ขนาดสูงสุดของคำขอ GET จำกัด ไว้ที่ 4k ซึ่งคุณสามารถเกินได้อย่างง่ายดายโดยการส่งอาร์เรย์ใน URL

นอกจากนี้ยังไม่ใช่วิธีที่ปลอดภัยที่สุดในการส่งผ่านข้อมูล! คุณควรพิจารณาใช้เซสชันแทน


การทำให้เป็นอนุกรมก็เป็นวิธีที่ดีเช่นกัน แต่มันก็อยู่ในรูปแบบที่ไม่สามารถอ่านได้อีกต่อไป
knittl

1
ใช่การทำให้เป็นอนุกรมไม่ใช่วิธีที่สะอาดในการทำสิ่งต่างๆเมื่อคุณทำงานกับ URL เพราะมันขยายข้อมูลได้มาก ไปกำหนดเองดีกว่า
Kzqai

ขนาดสูงสุดของพารามิเตอร์ GET คือสิ่งที่ฉันกังวลว่าทำไมฉันถึง (โง่) โดยหวังว่าตัวแยกวิเคราะห์จะไม่สนใจถ้าอาร์เรย์ที่ส่งผ่านไป ตอนนี้ฉันรู้แล้วว่ามันใช้งานไม่ได้โดยไม่ต้องแตะขนาดสูงสุด ขอบคุณ nash ฉันคิดว่าฉันจะทำมันด้วยเซสชัน
uji

4
คุณไม่ควรส่งต่อข้อมูลที่ไม่น่าเชื่อถือไปยัง Unerialize () ลองใช้ json_encode () และ json_decode () แทน
Mikko Rantalainen

6

โปรดหลีกเลี่ยงตัวแปรของคุณเมื่อแสดงผล ( urlencode)

และคุณไม่สามารถพิมพ์อาร์เรย์ได้คุณต้องสร้าง URL ของคุณโดยใช้การวนซ้ำ

$url = 'http://example.com/index.php?'
$first = true;
foreach($aValues as $key => $value) {
  if(!$first) $url .= '&amp';
  else $first = false;
  $url .= 'aValues['.urlencode($key).']='.urlencode($value);
}

1
แทนที่จะใช้ตัวแปร "ตัวแรก" เพื่อข้าม & amp; ตัวแรกคุณสามารถใช้อาร์เรย์ชั่วคราวในการจัดเก็บค่าของคุณและใช้คำต่อท้ายแบบระเบิด เพียงเพื่อการอ่าน php.net/implode
nash

5
 <?php
$array["a"] = "Thusitha";
$array["b"] = "Sumanadasa";
$array["c"] = "Lakmal";
$array["d"] = "Nanayakkara";

$str = serialize($array);
$strenc = urlencode($str);
print $str . "\n";
print $strenc . "\n";
?> 

print $str . "\n"; ให้a:4:{s:1:"a";s:8:"Thusitha";s:1:"b";s:10:"Sumanadasa";s:1:"c";s:6:"Lakmal";s:1:"d";s:11:"Nanayakkara";} และ

print $strenc . "\n"; จะช่วยให้

a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A8%3A%22Thusitha%22%3Bs%3A1%3A%22b%22%3Bs%3A10%3A%22Sumanadasa%22%3Bs%3A1%3A%22c%22%3Bs%3A6%3A%22Lakmal%22%3Bs%3A1%3A%22d%22%3Bs%3A11%3A%22Nanayakkara%22%3B%7D

ดังนั้นถ้าคุณต้องการที่จะผ่านนี้$arrayผ่าน URL ไปยังpage_no_2.php,

เช่น: -

$url ='http://page_no_2.php?data=".$strenc."';

ต้องการกลับไปยังอาร์เรย์เดิมจะต้องมีurldecode()แล้วunserialize()เช่นนี้ใน page_no_2.php:

    <?php
    $strenc2= $_GET['data'];
    $arr = unserialize(urldecode($strenc2));
    var_dump($arr);
    ?>

จะช่วยให้

 array(4) {
  ["a"]=>
  string(8) "Thusitha"
  ["b"]=>
  string(10) "Sumanadasa"
  ["c"]=>
  string(6) "Lakmal"
  ["d"]=>
  string(11) "Nanayakkara"
}

อีกครั้ง: D


3

ฉันทำสิ่งนี้ด้วยการเข้ารหัสข้อมูล base64 แบบอนุกรม วิธีที่ดีที่สุดและเล็กที่สุดฉันเดา urlencode เป็นการสิ้นเปลืองพื้นที่มากและคุณมีเพียง 4k


1

นี่ไม่ใช่คำตอบโดยตรงเนื่องจากได้รับคำตอบแล้ว แต่ทุกคนพูดถึงการส่งข้อมูล แต่ไม่มีใครบอกว่าคุณทำอะไรเมื่อไปถึงที่นั่นและฉันใช้เวลาครึ่งชั่วโมงในการแก้ไข เลยคิดว่าจะช่วยตรงนี้

ฉันจะทำซ้ำบิตนี้

$data = array(
'cat' => 'moggy',
'dog' => 'mutt'
);
$query = http_build_query(array('mydata' => $data));
$query=urlencode($query);

เห็นได้ชัดว่าคุณจะจัดรูปแบบได้ดีกว่านี้ www.someurl.com?x=$query

และเพื่อรับข้อมูลกลับมา

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];

0
**in create url page**

$data = array(
        'car' => 'Suzuki',
        'Model' => '1976'
        );
$query = http_build_query(array('myArray' => $data));
$url=urlencode($query); 

echo" <p><a href=\"index2.php?data=".$url."\"> Send </a><br /> </p>";

**in received page**

parse_str($_GET['data']);
echo $myArray['car'];
echo '<br/>';
echo $myArray['model'];

0

ในหน้าที่ได้รับคุณสามารถใช้:

parse_str ($ str, $ array); var_dump ($ อาร์เรย์);


ยินดีต้อนรับสู่ Stack Overflow เมื่อเพิ่มคำตอบให้กับคำถามอายุ 10 ปีพร้อมกับคำตอบอื่น ๆ อีกแปดคำเป็นสิ่งสำคัญมากที่จะต้องชี้ให้เห็นว่าคำถามของคุณมีแง่มุมใหม่อะไรบ้าง ตอนนี้ดูเหมือนว่าคุณมีคำตอบเฉพาะรหัสที่คำตอบอื่น ๆ ครอบคลุมอยู่แล้ว โปรดใช้การจัดรูปแบบรหัสสำหรับรหัสในคำตอบในอนาคต
Jason Aller

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