Сегодня решил разобраться, как PHP определяет ключ в массив $_GET для параметров, поступивших соответственно методом GET. Честно говоря, такой алогичности в работе этого механизма увидеть я не ожидал. Хотя в целом, почему так получилось, понятно…
Итак, сразу к практике. Как по вашему мнению в $_GET будет отображена строка такого вида: «?aa[bb][cc=11»? Вариантов в принципе не так мало, среди них и логичные, и не очень. В результате в PHP получим такие ключи массива: $_GET[‘aa’][‘bb’]=11. Куда делось «cc»? Что даст «?aa[bb]cc=11»? Тоже самое ($_GET[‘aa’][‘bb’]=11). Куда опять делось «cc» не понятно. Но самое интересное впереди!
Что даст «?aa[bbb=11»? Конечно $_GET[‘aa_bbb’]=11, как же можно было не угадать, это же интуитивно-понятное продолжение примеров выше :)
«?aa[bb[ccc]]=11» дает $_GET[‘aa’][‘bb[ccc’]=11. Вторую скобку опять украли!
Ну и пик программы: «?[aa]=7». var_dump($_GET) выдаст: Array() — пустой массив. «А-а-а, где же мой гет?..» Наверное, логичне было бы как минимум создать ключ $_GET[»]. Врочем, во всех этих спорных случаях вариантов много и спорить об их правильности можно долго.
Вот такие метаморфозы. Частично такое поведение объясняет то, что в первых версиях языка параметры парсились не в массив, а в переменные. Тогда запретные символы было принято заменять подчеркиванием. В одном из примеров выше наблюдается такая замена. Она действует, когда данный параметр не считается массивом. А вот если параметр распознан как массив, включается новая хитрая логика, которая в одних случаях просто откидывает лишнее, в других откидывает только часть неугодного, а часть целиком пихает в ключ. Не интуитивно, не логично.
Хорошо что приходится мало данных по Get/Post перетягивать. Максимум то массив каких-нить filter[category_id] или to_delete[4]=1
А зачем, собственно, извращаться?
Ну и если уж очень хочется изврата, то парси $_SERVER[‘REQUEST_URI’]