Update Route matches

Reduced code. Fixed uppercase for params (controller, category).
`array_filter` is often a lot faster than anything with foreach, because the loop and the data management all happens in native code - there are many fewer userland operations and stack changes. You're right I'd not allowed for the overhead of the closure though which is higher than I'd expected.

We can't use my example above because `ARRAY_FILTER_USE_KEY` is PHP >= 5.6. For lower versions the best I've found is:

```php
$int_keys = array_filter(array_keys($matches), 'is_numeric');
$params   = $int_keys ? array_diff_key($matches, array_fill_keys($int_keys, NULL)) : $matches;
```

I just did a quick benchmark of:
* the original code (foreach and copy valid elements to new array)
* your code (foreach and unset invalid)
* array_filter with native function (can't use)
* array_filter with closure (can't use)
* possible solution

|                 | 4 string | 3 string + 1 int | 13 string | 10 string + 3 int |
|--------------|----------|--------------------|-------------|---------------------|
| copy valid | 24 μs | 22 μs | 69 μs | 68 μs |
| unset invalid | 20 μs | 19 μs | 58 μs | 58 μs |
| array_filter native | 6 μs | 6 μs | 7 μs | 8 μs |
| array_filter closure | 37 μs |36 μs | 106 μs | 102 μs |
| array_filter + diff_key  | 11 μs | 19 μs | 14 μs | 22 μs |

So it's basically always worth doing `array_filter` if there's a native function that does what you need, or if you can use a native function to find the values to reject and then `array_diff_key` to strip them out of the array.

Note also that it's fastest in the common (pure associative array) case, with only a small hit if it finds integer keys to remove.