A PHP array is a hash table even when the keys are 0 to n, and for a large numerically indexed list that overhead is most of the memory.
$a = range(0, 1000000);
// memory: ~33 MB
$b = SplFixedArray::fromArray(range(0, 1000000));
// memory: ~16 MB
// the trade: fixed size, integer keys only, and
// none of the array_* functions work on it
Halving the memory matters for exactly one shape of problem: a long numeric list held entirely in memory, which is usually a sign that a generator would be better still. Where the data genuinely has to be random-access and resident — a sieve, a lookup table, a bitmap — this is the right structure and is under-used. Everywhere else the loss of array_map and friends costs more in readability than the memory is worth.