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

196

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

pg_id=2&parent_id=2&document&video 

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

array(
    'pg_id' => 2,
    'parent_id' => 2,
    'document' => ,
    'video' =>
)
laukok
источник

Ответы:

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 );
yassine2020
источник
3
Я предполагаю, что это ожидает$_SERVER['QUERY_STRING']
CpILL
как массив для строки URL ex. : Array ([? Somepage ID] => 123 [Lang] => гр [размер] => 300) выход = somepage ID = 123 & Ланг = г & размер = 300?
Mehul
32

Использование parse_str().

$str = 'pg_id=2&parent_id=2&document&video';
parse_str($str, $arr);
print_r($arr);
Ракета Хазмат
источник
18

Используйте http://us1.php.net/parse_str

Внимание, это использование:

parse_str($str, &$array);

не

$array = parse_str($str);
Ионут Бэеску
источник
2
Это `parse_str ($ str, $ arr);` и не parse_str($str,&$arr);страшная ошибка
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' =>
)
Каспер Уилкс
источник
14

Есть несколько возможных способов, но для вас уже есть встроенная parse_strфункция

$array = array();
parse_str($string, $array);
var_dump($array);
KingCrunch
источник
3

Это одна строка для анализа запроса с текущего URL в массив:

parse_str($_SERVER['QUERY_STRING'], $query);
hovado
источник
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);
JakeGould
источник
-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