Re: Proposal for a new array function

From: Date: Mon, 08 Feb 2016 18:06:22 +0000
Subject: Re: Proposal for a new array function
References: 1 2 3 4 5  Groups: php.internals 
Request: Send a blank email to internals+get-91130@lists.php.net to get a copy of this message
On Mon, Feb 8, 2016 at 12:53 PM, Larry Garfield <larry@garfieldtech.com> wrote: > On 2/8/16 11:46 AM, Kinn Julião wrote: > >> On Mon, Feb 8, 2016 at 11:38 AM, Rowan Collins <rowan.collins@gmail.com> >> wrote: >> >> Kinn Julião wrote on 08/02/2016 16:05: >>> >>> That's the nice thing about userland... you are giving them ability to >>>> implement what they want! >>>> array_filter([...], 'is_int', ARRAY_FILTER_USE_KEY)l >>>> ³ÃµU=¤Zš­²RãdH does the job as >>>> the >>>> others... don't think having a new function would prevent this. >>>> >>>> It does the job, but it is much less efficient in some cases than the >>> foreach and return false case, as it must examine every element; it also >>> has unnecessary memory overhead, creating a filtered list which exists >>> only >>> to be counted and thrown away; and an internal implementation could be >>> optimised even further by exploiting the way the engine stores the array >>> internally. >>> >>> How does array_filter([...], 'is_int', >>> ARRAY_FILTER_USE_KEY) add that >> *much* overhead? >> And if that's the case, instead of introducing a 99999 array function into >> the core, why not just create a new Object then? >> >> $list = list('foo','bar'); // I know it's a reserved token, >> don't have >> time >> to find a better synonym. it's just a sample >> $list[2] = 'baz'; >> >> var_dump($list); >> >> string(1) "foo" >> string(1) "bar" >> string(1) "baz" >> >> $list['a'] = 'foobar'; // Fatal error. >> > > I'm confused at the goal here. Is the intent "I need to do different > logic if this is a numeric array vs. something else" or "I need to make > sure this is a numeric array, because things break otherwise"? > It doesn't really matter, and the explanation is below[1] (you actually wrote it). > > If the latter, $foo = array_values($bar); is a reasonably efficient and > reasonably bulletproof way to ensure you have a strictly numeric array. > > Agreed. > PHP is at this stage expressive enough that a large number of core >>> functions could be rewritten in multiple ways using other core functions, >>> but that doesn't automatically rule out adding more functions to core >>> where >>> it is useful to do so. >>> >> >> PHP is at a stage where we can add support to a better structure and >> objects support... we don't need a function to check if the keys are >> integer, we need an object that only supports integer as keys, or even a >> generic key... >> >> Would rather have Map<int, mixed> than h©Ä´‰Ò@ >> A°¹Eù¾Œhas_numeric_keys >> > > Or that. Which I like even better. Ahead-of-time typing is much safer at > scale than runtime typing. (Of course we then run smack into the > arrays-and-objects-are-just-different-enough-to-be-annoying problem that > has plagued us for a decade.) > > [1] - That's why it doesn't matter if it's to restrict or validate... As the top post mentions: ` function isArrNum($arr) { foreach($arr as $i =>$v){ if (!is_int($i)) { return false; } } return true; } ` If you want to check the keys type. ``` return $variable instanceof Map; ``` Don't want to bc? ``` function isArrNum($arr) if (class_exists('Map')) $variable instanceof Map; foreach($arr as $i =>$v){ if (!is_int($i)) { return false; } } return true; } ``` Ugly? sure... but at least now we have support to a better structure... remember: Working towards making PHP 7 even better... adding support to Map(or whatever people wanna call it) can make it better, adding a has_numeric_keys, IMHO, is just an alias to other userland options. > -- > --Larry Garfield > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- *--* *Kinn Coelho Julião* *Toronto - ON/Canada*

« previous php.internals (#91130) next »