Edit report at https://bugs.php.net/bug.php?id=63818&edit=1
ID: 63818 User updated by: dkadosh at affinegy dot com Reported by: dkadosh at affinegy dot com Summary: Need option to search in array keys instead of values Status: Open Type: Feature/Change Request Package: PCRE related Operating System: any PHP Version: 5.3.20 Block user comment: N Private report: N New Comment: @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. Previous Comments: ------------------------------------------------------------------------ [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