Вся сложность в том что при использовании parse_str параметры которые являются массивом, преобразуются в массив в РНР
Array
(
[Filter] => Array
(
[form] => 1
[type] => 2
)
)
Быстрый хак - можно в исходной строке
$qs_part сделать замену параметра на некий уникальный плейсхолдер, который явно в строке не встретится и тогда удалить элемент можно будет через
unset() как и хотел автор.
<?php
$url = 'https://example.com/search?Filter[form]=1&Filter[type]=2';
$name = 'Filter[form]';
print_r(deleteGET($url, $name));
//https://example.com/search?Filter%5Btype%5D=2
function deleteGET($url, $name, $amp = true)
{
// Заменяем сущности на амперсанд, если требуется
$url = str_replace("&", "&", $url);
// Разбиваем URL на 2 части: до знака ? и после
list($url_part, $qs_part) = array_pad(explode("?", $url), 2, "");
$qs_part = str_replace($name.'=', '{REPLACE_NAME}=', $qs_part);
// Разбиваем строку с запросом на массив с параметрами и их значениями
parse_str($qs_part, $qs_vars);
// Удаляем необходимый параметр
unset($qs_vars['{REPLACE_NAME}']);
// Если есть параметры
if(count($qs_vars) > 0)
{
$url = $url_part."?".http_build_query($qs_vars); // Собираем URL обратно
if($amp)
{
// Заменяем амперсанды обратно на сущности, если требуется
$url = str_replace("&", "&", $url);
}
}
else
{
// Если параметров не осталось, то просто берём всё, что идёт до знака ?
$url = $url_part;
}
// Возвращаем итоговый URL
return $url; // Возвращаем итоговый URL
}