novactown
novactown

Reputation: 137

Remove an array element by value from a URL querystring string

How can I take a string like:

navMenu[]=1&navMenu[]=6&navMenu[]=2&navMenu[]=3&navMenu[]=4&navMenu[]=5

And in php make it so that I can remove a certain value for the navMenu[], but it would still stay in the same order but with the value removed. Or add a value as well.

I have been tampering with exploding it at the & sign but am not sure how I can add or remove a value, and making sure the & sign is not at the start or end of the string.

Upvotes: -1

Views: 244

Answers (2)

mickmackusa
mickmackusa

Reputation: 48041

A side effect of parsing the querystring, filtering it, then re-encoding it is that the implied indexes (empty square braces) will be replaced with explicit indexes. Without calling array_unique() on the filtered temporary array, there will be a potential gap in the in keys - this may or may not be problematic. Also, the square braces themselves will be URL encoded (which makes the string harder for humans to read -- if it matters). https://3v4l.org/eWM9O

Alternatively, you can use a regular expression to manipulate the predictable and repetitive string without parsing it. The pattern uses a conditional expression to correctly match the leading or trailing & (but never both) and it uses a word boundary to ensure that only the whole integer is matched when filtering.

Code: (Demo with a few examples)

echo preg_replace('#(&)?navMenu\[]=' . preg_quote($find) . '\b(?(1)|&?)#', '', $str);

Largely similar content: Replace a whole integer match in a delimited string and a maximum of one of its adjacent commas

Upvotes: -1

deceze
deceze

Reputation: 522510

$str = 'navMenu[]=1&navMenu[]=6&navMenu[]=2&navMenu[]=3&navMenu[]=4&navMenu[]=5';
parse_str($str, $values);
$values['navMenu'] = array_diff($values['navMenu'], array('3'));
echo http_build_query($values);

If you're getting this from the request, you don't even need parse_str, you can just get the already parsed string from $_GET or $_POST, remove the value, then use http_build_query to reassemble it into a query string.

Upvotes: 1

Related Questions