Разобрать строку запроса в массив


196

Как я могу превратить строку ниже в массив ?

pg_id=2&parent_id=2&document&video 

Это массив, который я ищу,

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

Ответы:


331

Вам нужна 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
Энтони

Это было полезно! Я решил сделать это ?key[]=lorem&key[]=ipsumнесколько недель назад. Но спасибо, что поделились ссылкой!
МаБи

2
На что следует обратить внимание, так это на строки, содержащие «+», например myemail+alias@gmail.com. Они будут проанализированы parse_str в пробел. ключ = myemail 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

как массив для строки URL ex. : Array ([? Somepage ID] => 123 [Lang] => гр [размер] => 300) выход = somepage ID = 123 & Ланг = г & размер = 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, оставьте соединение (выберите xx), где (выберите топ 1 xxx из xxx) oder по xxx desc ";

Запрос после

выберите хх из хх

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

выберите хх из хх левого соединения (выберите хх), где (выберите топ 1 ххх из ххх) или от ххх

Спасибо, из Индонезии 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
@Cristian: «Вы никогда не должны иметь одно и то же имя параметра запроса с разными значениями». Вы правы, но в ответе говорится: «… URL-адрес, по которому функция будет молча отказывать, без выдачи ошибки или исключения». Который может сломать приложение. Хотя этот ответ не очень хороший, он все же выделяет проблему. Особенно, если ваше приложение может быть разбито кем-то, только что произвольно сделавшим запрос с добавленными дополнительными параметрами.
JakeGould
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.