แยกสตริงการสืบค้นลงในอาร์เรย์


195

ฉันจะเปลี่ยนสตริงด้านล่างเป็นอาร์เรย์ได้อย่างไร

pg_id=2&parent_id=2&document&video 

นี่คืออาร์เรย์ที่ฉันกำลังมองหา

array(
    'pg_id' => 2,
    'parent_id' => 2,
    'document' => ,
    'video' =>
)

คำตอบ:


330

คุณต้องการparse_strฟังก์ชั่นและคุณต้องตั้งค่าพารามิเตอร์ที่สองเพื่อให้ข้อมูลใส่ในอาร์เรย์แทนที่จะเป็นตัวแปรแต่ละตัว

$get_string = "pg_id=2&parent_id=2&document&video";

parse_str($get_string, $get_array);

print_r($get_array);

2
ฉันมีปัญหากับคำตอบนี้เพราะมันไม่ทำงานถ้าคุณใช้คีย์เดียวกันหลาย ๆ ครั้ง (ใช่เพราะในคีย์อาเรย์ของ php นั้นไม่เหมือนใคร) ดังนั้น?key=lorem&key=ipsumจะส่งผลให้array(["key"]=>"ipsum")คำถามคือมีฟังก์ชั่นที่จะได้รับ s.th แบบนี้array(["key"]=>array("lorem", "ipsum"))หรือฉันต้องสร้างฟังก์ชั่นนี้ด้วยตัวเอง?
MaBi

11
ในทางเทคนิคแล้ว PHP ก็จะทำ?key=lorem&key=ipsumเหมือนว่าคุณให้ไว้key=ipsumหากเป็นสตริงการสืบค้นใน URL และฉันคิดว่ามันไม่ถูกต้องที่จะนำคีย์กลับมาใช้ใหม่และคาดหวังผลลัพธ์ที่สอดคล้องกันหรือว่าอินสแตนซ์ทั้งหมดของคีย์จะถูกเก็บไว้ วิธีการที่ถูกต้องอย่างน้อยสำหรับสตริงแบบสอบถามที่ส่งไปยัง PHP จะเป็น?key[]=lorem&key[]=ipsumดังนั้นวิธีการพื้นบ้านของคุณอาจมองหาเหตุการณ์ที่เกิดขึ้น &{x}=ที่ x เกิดขึ้นมากกว่าหนึ่งครั้งและแทนที่ด้วยx[](และปฏิบัติเช่นเดียวกับ &)
Anthony

9
@Mabi - โอ้และดูคนอื่นเห็นด้วยกับคุณและสร้างฟังก์ชั่นของตัวเองแล้ว - php.net/manual/en/function.parse-str.php#76792
Anthony

นั่นเป็นประโยชน์! ฉันตัดสินใจที่จะทำแบบนี้เมื่อ?key[]=lorem&key[]=ipsumหลายสัปดาห์ก่อน แต่ขอบคุณที่แบ่งปันลิงค์!
MaBi

2
สิ่งที่ต้องระวังคือสตริงที่มี '+' เช่น myemail+alias@gmail.com สิ่งเหล่านี้จะถูกแยกวิเคราะห์โดย parse_str ไปยังช่องว่าง key = myemail alias@gmail.com
dudeman

62

บางครั้งparse_str()เพียงอย่างเดียวก็ทราบถูกต้องมันสามารถแสดงตัวอย่าง:

$url = "somepage?id=123&lang=gr&size=300";

parse_str () จะกลับมา:

Array ( 
    [somepage?id] => 123 
    [lang] => gr 
    [size] => 300 
)

มันจะดีกว่าที่จะรวมparse_str()กับparse_url()เช่น:

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );

3
ฉันเดาว่ามันคาดหวัง$_SERVER['QUERY_STRING']
CpILL

วิธีการจัดเรียงให้เป็นสตริง URL ตัวอย่างเช่น : Array ([somepage? id] => 123 [lang] => gr [size] => 300) เอาท์พุท = somepage? id = 123 & lang = gr & size = 300
mehul



17

หากคุณมีปัญหาในการแปลงสตริงเคียวรีเป็นอาร์เรย์เนื่องจากแอมป์แซนด์ที่เข้ารหัส

&

จากนั้นให้แน่ใจว่าจะใช้ html_entity_decode

ตัวอย่าง:

// Input string //
$input = 'pg_id=2&parent_id=2&document&video';

// Parse //
parse_str(html_entity_decode($input), $out);

// Output of $out //
array(
  'pg_id' => 2,
  'parent_id' => 2,
  'document' => ,
  'video' =>
)


3

นี่คือซับในสำหรับการแยกวิเคราะห์เคียวรีจาก URL ปัจจุบันไปยังอาร์เรย์:

parse_str($_SERVER['QUERY_STRING'], $query);

1

คุณสามารถใช้ฟังก์ชันสตริงของ PHP parse_str()แล้วตามด้วยforeachลูป

$str="pg_id=2&parent_id=2&document&video";
parse_str($str,$my_arr);
foreach($my_arr as $key=>$value){
  echo "$key => $value<br>";
}
print_r($my_arr);

-3

นี่คือรหัส PHP เพื่อแยกคิวรีใน mysql & mssql

enter code here
function splitquery($strquery)
{
$arrquery=explode('select',$strquery);

$stry='';$strx='';

for($i=0;$i<count($arrquery);$i++)
{
if($i==1)
{
    echo 'select '.trim($arrquery[$i]);
}
elseif($i>1)
{

$strx=trim($arrquery[($i-1)]);

    if(trim(substr($strx,-1))!='(')
    {
        $stry=$stry.'

select '.trim($arrquery[$i]);
    }
    else
    {
        $stry=$stry.trim('select '.trim($arrquery[$i]));
    }

$strx='';
}
} 

return $stry;
}

ตัวอย่าง:

สอบถามก่อน

เลือก xx จาก xx เลือก xx, (เลือก xx) จาก xx โดยที่ y = 'cc' เลือก xx จาก xx left join (เลือก xx) โดยที่ (เลือก 1 อันดับแรก xxx จาก xxx) อีกครั้งโดย xxx desc ";

ค้นหาหลังจาก

เลือก xx จาก xx

เลือก xx (เลือก xx) จาก xx โดยที่ y = 'cc'

เลือก xx จาก xx left join (เลือก xx) โดยที่ (เลือก 1 xxx อันดับแรกจาก xxx) หรืออื่น ๆ ด้วย xxx desc

ขอบคุณจากอินโดนีเซียSentrapedagang.com


-5

สำหรับคำถามเฉพาะนี้คำตอบที่เลือกนั้นถูกต้อง แต่หากมีพารามิเตอร์ซ้ำซ้อน - เช่น "e" พิเศษใน URL ฟังก์ชันจะล้มเหลวในทันทีโดยไม่มีข้อผิดพลาดหรือข้อยกเว้นถูกโยนทิ้ง:

a=2&b=2&c=5&d=4&e=1&e=2&e=3 

ดังนั้นฉันชอบใช้ parser ของตัวเองเช่น:

//$_SERVER['QUERY_STRING'] = `a=2&b=2&c=5&d=4&e=100&e=200&e=300` 

$url_qry_str  = explode('&', $_SERVER['QUERY_STRING']);

//arrays that will hold the values from the url
$a_arr = $b_arr = $c_arr = $d_arr = $e_arr =  array();

foreach( $url_qry_str as $param )
    {
      $var =  explode('=', $param, 2);
      if($var[0]=="a")      $a_arr[]=$var[1];
      if($var[0]=="b")      $b_arr[]=$var[1];
      if($var[0]=="c")      $c_arr[]=$var[1];
      if($var[0]=="d")      $d_arr[]=$var[1];
      if($var[0]=="e")      $e_arr[]=$var[1];
    }

    var_dump($e_arr); 
    // will return :
    //array(3) { [0]=> string(1) "100" [1]=> string(1) "200" [2]=> string(1) "300" } 

ตอนนี้คุณมีการเกิดขึ้นทั้งหมดของแต่ละพารามิเตอร์ในอาเรย์ของตัวเองคุณสามารถรวมเข้าไปในอาเรย์เดียวถ้าคุณต้องการ

หวังว่าจะช่วย!


คุณไม่ควรมีชื่อพารามิเตอร์การสืบค้นเดียวกันที่มีค่าต่างกัน มันไม่สมเหตุสมผลเพราะจะมีเพียงคนเดียวเท่านั้นที่ยอมรับ
Cristian

3
@Cristian:“ คุณไม่ควรมีชื่อพารามิเตอร์การสืบค้นเดียวกันที่มีค่าต่างกัน” คุณถูกต้อง แต่คำตอบระบุว่า“ … URL ที่ฟังก์ชั่นจะล้มเหลวอย่างเงียบ ๆ โดยไม่มีข้อผิดพลาดหรือข้อยกเว้นเกิดขึ้น” ซึ่งอาจทำลายแอปพลิเคชัน ในขณะที่คำตอบนี้ไม่ดีมันจะเน้นปัญหา โดยเฉพาะอย่างยิ่งหากแอปพลิเคชันของคุณอาจมีการขัดข้องโดยผู้อื่นเพียงส่งคำขอโดยมี params พิเศษโยนเข้ามา
JakeGould
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.