Re: RFC [Discussion]: array_find

From: Date: Thu, 11 Apr 2024 01:03:09 +0000
Subject: Re: RFC [Discussion]: array_find
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-123106@lists.php.net to get a copy of this message
On Sun, Apr 7, 2024 at 8:38 AM Larry Garfield <larry@garfieldtech.com> wrote: > > On Sun, Apr 7, 2024, at 10:20 AM, Joshua Rüsweg wrote: > > Hi > > I have created an RFC to add the function array_find which returns the > > first element for which a predicate callback returns true. This is a > > function which I missed often. Furthermore this type of function is > > implemented with other programming languages like C++, JavaScript and > > Rust, too. > > You can find the RFC at: > > https://wiki.php.net/rfc/array_find > > Proof of concept implementation is in: > > > > https://github.com/joshuaruesweg/php-src/commit/9f3fc252b92f534d498e5f1e6a463e15f45da208 > > I'm looking forward to your feedback. > > Cheers > > Joshua Rüsweg > > I'm open to this, but two points that I'm sure someone will bring up: > > 1. Should this work on arrays or iterables? This is a long standing limitation of PHP. The > array operations don't work on iterables, even though we've had iterables for 20 years.) > > 2. Key handling. It's good that you have looked into this, because I was going to mention > it. :-) However, I don't think a boolean is the right answer, since the question is binary, > not true/false. (Those are not the same thing.) I think a small return-mode Enum would make more > sense here. IMO, it's better to separate it into two functions because its type is stable without control flow. For instance: // Returns K if $b is true, V otherwise. function array_find( array<K, V> $array, callable(V, K): bool $callback, bool $b = false ) -> K|V; This isn't stable and requires control-flow to understand the type. These are simpler: function array_find( array<K, V> $array, callable(V, K): bool $callback ) -> V; function array_find_key( array<K, V> $array, callable(V, K): bool $callback ) -> K; Naming bikeshedding aside, it's better to have types that are inferrable without function-specific knowledge of control flow. It doesn't matter if it's a bool or an enum, it still has problems. Better to just separate them to different functions.

« previous php.internals (#123106) next »