在SO上搜索有关此问题的问题后,我只能找到AndroidJUnitRunner和this,但都不允许向搜索函数发送自变量(AKA针),而是使用预定义的函数并使用array_filter
。
我搜索了this,但没有找到。
我想要类似(启用in_array
documentation):
function uin_array($haystack, $needle, $compareFunc)
我设法通过简单的foreach
循环来实现它:
function uin_array($haystack, $needle, $compareFunc) {
foreach($haystack as $e) {
if ($compareFunc($needle, $e) == 0)
return true;
}
return false;
}
示例:
$found = uin_array(["AA", "BB", "CC", "DD"], "cc", "strcasecmp");
这也可以用于多维数组的搜索。
我的问题:
在PHP中是否有我不知道的内置函数/标志? 有没有更好的方法来实现它?
修改:
我知道我可以将array_filter
用作:current(array_filter($haystack, function($element) use ($needle) { ... }))
,但在所有情况下为O(n)-使用loop and break或in_array可能为O(1)在某些情况下(只有在最坏的情况下才是O(n),但不是全部)
答案 0 :(得分:1)
看看很棒的nikic/iter library。
$haystack = ["AA", "BB", "CC", "DD"];
$needle = "cc";
$found = \iter\any(function ($value) use ($needle) {
return strcasecmp($needle, $value);
}, $haystack);
答案 1 :(得分:1)
如果您不担心函数流动,请查看functional-php library。
use function Functional\partial_any;
use function Functional\some;
use function Functional\placeholder;
$haystack = ["AA", "BB", "CC", "DD"];
$needle = "cc";
$compareFunc = "strcasecmp";
$found = some($haystack, partial_any($compareFunc, $needle, placeholder()));
该库提供了很好的帮手,可以编写更多功能性的代码,但是我建议您在整个项目中使用它,或者根本不使用它,因为只需要偶尔使用一两次就不会很有道理。
答案 2 :(得分:0)
为此,您可以使用array_reduce或array_filter返回0、1或多个符合条件的项目。
答案 3 :(得分:0)
您可以使用array_map
,strcasecamp
,array_filter
$needle = 'cc';
$compareFunc = 'strcasecmp';
$found = count(array_filter(array_map(function($v) use ($needle,$compareFunc){
if($compareFunc($v, $needle) == 0) return 1;
}, ["AA", "BB", "CC", "DD"])));