Req #63818 [Opn->Sus]: Need option to search in array keys instead of values
Edit report at https://bugs.php.net/bug.php?id=63818&edit=1
ID: 63818
Updated by: cmb@php.net
Reported by: dkadosh at affinegy dot com
Summary: Need option to search in array keys instead of
values
-Status: Open
+Status: Suspended
Type: Feature/Change Request
Package: PCRE related
Operating System: any
PHP Version: 5.3.20
Block user comment: N
Private report: N
New Comment:
This feature appears to be controversial, and as such would
require the RFC process[1]. Anybody is welcome to start it! For
the time being, I'm suspending this ticket.
[1] <https://wiki.php.net/rfc/howto>
Previous Comments:
------------------------------------------------------------------------
[2013-04-01 13:45:36] dkadosh at affinegy dot com
@danielklein: Yes, that's definitely more efficient than my work-around function,
thanks.
However, it is not as efficient as having it done entirely in C per my original
request, as your solution still involves partially duplicating the original array,
etc. My use case involves processing pretty high volumes of data, so the arrays
can be quite large (~5K items), and this function being called several million
times a day.
------------------------------------------------------------------------
[2013-03-14 22:52:11] danielklein at airpost dot net
How about this?
<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
?>
------------------------------------------------------------------------
[2012-12-20 17:06:30] dkadosh at affinegy dot com
Description:
------------
---
From manual page: http://www.php.net/function.preg-grep
---
I'm asking for an extra flag to this function, to cause it to do its search in the array keys
rather than in the values.
While there's a comment in the above page of how to "post-process" preg_grep()
results to achieve this, I'd rather it be done in C (inside the PCRE code) than PHP for
performance reasons.
I thought about something like this:
$a = array_flip( preg_grep('/Version$/', array_flip($aParams)) );
which would almost return what I want, HOWEVER it has two problems:
1) If certain values of $aParams are duplicated, the first array_flip() will "lose" those
rows in the array.
2) I'd incur a sizeable CPU and memory hit by calling array_flip, which duplicates the array(s)
in RAM.
Test script:
---------------
The current work-around:
function preg_grep_keys( $pattern, $input, $flags = 0 )
{
$keys = preg_grep( $pattern, array_keys( $input ), $flags );
$vals = array();
foreach ( $keys as $key )
{
$vals[$key] = $input[$key];
}
return $vals;
}
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=63818&edit=1
Thread (4 messages)