On 02/05/2017 10:13, Jesse Schalken wrote:
Related to the optimisation made by Sara Golemon here: https://github.com/php/php-src/commit/c74bc87c74f48bc55541b3bf2fc67d595f58a3b5I often define a function like this, which checks if an array is "vector like" i.e. has keys 0,1,2..N: function is_vectorlike(array $a): bool { $i = 0; foreach ($a as $k => $v) { if ($k !== $i++) { return false; } } return true; } The problem is that this function is O(n), but in PHP7 an array that is vector-like is likely to be packed and without holes (HT_IS_PACKED(x) && HT_IS_WITHOUT_HOLES(x)), in which case it is known to be vector-like without needing to iterate over it, but PHP code can't check for this (nor should it be able to, since it's really an implementation detail). Would it be a good idea to define this is_vectorlike() function in the PHP runtime, so it can short circuit to return true on packed arrays without holes? The above code would be a suitable polyfill.
+1, I've been thinking of making a similar suggestion. We can bikeshed the name (it should certainly start with "array_"), but I think there's a very good case for having an optimised implementation built in, given the opportunities for short-cutting based on representation details.
As an example use case, serialization formats often dynamically switch between an "array"/"vector"/"list", and a "hash"/"dictionary"/"table". I came upon this example recently: https://github.com/php-amqplib/php-amqplib/blob/master/PhpAmqpLib/Wire/AMQPAbstractCollection.php#L218
Regards, -- Rowan Collins [IMSoP] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
