Phân tích chuỗi truy vấn thành một mảng


195

Làm thế nào tôi có thể biến một chuỗi dưới đây thành một mảng ?

pg_id=2&parent_id=2&document&video 

Đây là mảng tôi đang tìm kiếm,

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

Câu trả lời:


330

Bạn muốn parse_strhàm và bạn cần đặt tham số thứ hai để dữ liệu được đặt trong một mảng thay vì thành các biến riêng lẻ.

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

parse_str($get_string, $get_array);

print_r($get_array);

2
Tôi có một vấn đề với câu trả lời này, bởi vì nó không hoạt động nếu bạn sử dụng cùng một khóa nhiều lần (có vì trong các mảng mảng php là duy nhất). Vì vậy, ?key=lorem&key=ipsumsẽ dẫn đến array(["key"]=>"ipsum")Câu hỏi là, có một chức năng để có được s.th. như thế này array(["key"]=>array("lorem", "ipsum"))hay tôi phải tự tạo chức năng này?
MaBi

11
Về mặt kỹ thuật PHP cũng sẽ xử lý ?key=lorem&key=ipsumnhư thể bạn chỉ cung cấp key=ipsumnếu đó là chuỗi truy vấn trên URL. Và tôi nghĩ rằng nó được coi là không hợp lệ để sử dụng lại khóa và mong đợi kết quả nhất quán hoặc tất cả các phiên bản của khóa được giữ lại. Cách tiếp cận hợp lệ, ít nhất là cho một chuỗi truy vấn được gửi tới PHP, ?key[]=lorem&key[]=ipsumvì vậy, cách tiếp cận cây nhà của bạn có thể tìm kiếm bất kỳ sự cố nào xảy ra trong &{x}=đó x xảy ra nhiều lần và thay thế bằng x[](và xử lý? Giống như &)
Anthony

9
@Mabi - oh, và nhìn xem, một người khác đồng ý với bạn và đã tạo chức năng của riêng họ - php.net/manual/en/feft.parse-str.php#76792
Anthony

Điều đó thật hữu ích! Tôi đã quyết định làm điều đó như thế này ?key[]=lorem&key[]=ipsumvài tuần trước. Nhưng cảm ơn vì đã chia sẻ liên kết!
MaBi

2
Một cái gì đó cần chú ý là các chuỗi bao gồm '+', như myemail+alias @ gmail. Chúng sẽ được phân tích cú pháp bởi parse_str đến một khoảng trắng. key = myemail alias @ gmail.
dudeman

61

Đôi khi parse_str()một mình là ghi chú chính xác, nó có thể hiển thị ví dụ:

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

parse_str () sẽ trả về:

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

Sẽ tốt hơn nếu kết hợp parse_str()với parse_url()như vậy:

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

3
Tôi đoán nó đang mong đợi$_SERVER['QUERY_STRING']
CpILL 19/12/17

Làm thế nào để mảng vào chuỗi url cũ. : Mảng ([somepage? Id] => 123 [lang] => gr [size] => 300) output = somepage? Id = 123 & lang = gr & size = 300
mehul


18

Sử dụng http://us1.php.net/parse_str

Chú ý, đó là cách sử dụng là:

parse_str($str, &$array);

không phải

$array = parse_str($str);

2
Đó là parse_str ($ str, $ Array); `và không phải là parse_str($str,&$arr);sai lầm khủng khiếp

17

Nếu bạn gặp sự cố khi chuyển chuỗi truy vấn thành mảng vì ký hiệu được mã hóa

&

sau đó hãy chắc chắn để sử dụng html_entity_decode

Thí dụ:

// 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' =>
)

14

Có một số phương thức có thể, nhưng đối với bạn, đã có một hàm dựng sẵnparse_str

$array = array();
parse_str($string, $array);
var_dump($array);

3

Đây là một lớp lót để phân tích cú pháp truy vấn từ URL hiện tại thành mảng:

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

1

Bạn có thể sử dụng hàm chuỗi PHP parse_str()theo foreachvòng lặp.

$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

Đây là mã PHP để phân tách truy vấn trong 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;
}

Thí dụ:

Truy vấn trước

chọn xx từ xx chọn xx, (chọn xx) từ xx trong đó y = 'cc' chọn xx từ xx bên trái tham gia (chọn xx) trong đó (chọn top 1 xxx từ xxx) oder bởi xxx desc ";

Truy vấn sau

chọn xx từ xx

chọn xx, (chọn xx) từ xx trong đó y = 'cc'

chọn xx từ xx bên trái tham gia (chọn xx) trong đó (chọn top 1 xxx từ xxx) oder theo xxx desc

Cảm ơn bạn, từ Indonesia Sentrapedagang.com


-5

Đối với câu hỏi cụ thể này, câu trả lời được chọn là chính xác nhưng nếu có một tham số dự phòng, giống như một "e" bổ sung thì URL sẽ tự động bị lỗi mà không có lỗi hoặc ngoại lệ bị ném:

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

Vì vậy, tôi thích sử dụng trình phân tích cú pháp của riêng mình như vậy:

//$_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" } 

Bây giờ bạn có tất cả các lần xuất hiện của từng tham số trong mảng riêng của nó, bạn luôn có thể hợp nhất chúng thành một mảng nếu bạn muốn.

Mong rằng sẽ giúp!


Bạn không bao giờ nên có cùng tên param truy vấn với các giá trị khác nhau. Nó không có ý nghĩa vì dù sao chỉ có một sẽ được chấp nhận.
Cristian

3
@Cristian: Bạn không bao giờ nên có cùng tên param truy vấn với các giá trị khác nhau. Bạn đã đúng, nhưng câu trả lời khẳng định, URL, URL chức năng sẽ âm thầm thất bại mà không có lỗi hoặc ngoại lệ nào bị ném. Mà có thể phá vỡ một ứng dụng. Trong khi câu trả lời này không tuyệt vời, nó làm nổi bật một vấn đề. Đặc biệt là nếu ứng dụng của bạn có thể bị sập bởi ai đó chỉ cần tự ý đưa ra yêu cầu có thêm thông số được gửi đến.
JakeGould
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.