Розбір рядка запиту в масив


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[](і лікувати? Як те саме, що &)
Ентоні,

9
@Mabi - о, і дивіться, хтось інший погоджується з вами і вже створив свою функцію - php.net/manual/en/function.parse-str.php#76792
Ентоні

Це було корисно! Я вирішив зробити це так ?key[]=lorem&key[]=ipsumкілька тижнів тому. Але дякую за те, що поділилися посиланням!
MaBi

2
На що слід звернути увагу - це рядки, які містять "+", наприклад, myemail+alias@gmail.com. Вони будуть проаналізовані parse_str до пробілу. key = мій email alias@gmail.com.
дудман

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

як масив для рядка ur ex. : Array ([деяка сторінка? Id] => 123 [lang] => гр [розмір] => 300) вихід = деяка сторінка? 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;
}

Приклад:

Запит раніше

select xx from xx select xx, (select xx) from xx where y = 'cc' select xx from xx left join (select xx) where (select top 1 xxx from xxx) oder by xxx desc ";

Запит після

виберіть xx з xx

виберіть xx, (виберіть xx) з xx, де y = 'cc'

виберіть xx з xx зліва приєднатися (виберіть xx) де (виберіть верхній 1 xxx з xxx) oder від xxx desc

Дякую, з Індонезії Sentrapedagang.com


-5

Для цього конкретного запитання обрана відповідь правильна, але якщо є надлишковий параметр, як-от додаткове "е", в URL-адресі функція буде мовчазно відмовлятись без помилки чи винятку:

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

Тому я вважаю за краще використовувати власний аналізатор так:

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

Тепер у вас є всі входження кожного параметра у власному масиві, ви завжди можете їх об'єднати в один масив, якщо хочете.

Сподіваюся, що це допомагає!


У вас ніколи не повинно бути однакове ім'я парами запиту з різними значеннями. Це не має сенсу, оскільки все одно буде прийнятий лише один.
Крістіан

3
@ Крістіан: "Ви ніколи не повинні мати однакове ім'я парам-запиту з різними значеннями." Ви правильні, але у відповіді йдеться: "... URL-адреса, яку функція буде мовчаз виходити без помилки чи винятку". Що може зламати додаток. Хоча ця відповідь не є великою, вона все ж висвітлює проблему. Особливо, якщо ваш додаток може бути зламаний кимось просто довільно, роблячи запит із додатковими парами, що вкидаються.
подає параматами
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.