Not really; PHP's memory management is clever that way. It knows that $match[4] and $match['four'] refer to the same matched string, so it only stores one copy of the string and both array entries refer to it. In the same way, if $foo contains a five-MB string, then after the command [font=monospace]$bar = $foo;[/font], then PHP still only needs five megabytes to store both $foo and $bar.
If it's a matter of tidying up the array ... funny, I thought [man]array_filter[/man] passed the key as well ... I must have been thinking of [man]array_walk[/man] ...
$keys = array_filter(array_keys($matches), 'is_string');
$matches = array_intersect_key($matches, array_flip($keys));