For convenience, Drupal takes $keys by reference, and removes the items found from that array. The returned value only includes the found items.

Generally you'll have a code path that builds an array of the missing items on cache miss, then combine the found + missed items at the end, having two separate lists up front makes that a simple operation.

An alternative would be to return array($item1, FALSE, $item3) for found/not found items - but in that case returning an empty array when no items are found is inconsistent.

This means you know exactly what cache keys were missed, and the values of the returned items can be assigned to whichever array