使用用户定义的比较功能搜索针in_array



在 SO 上搜索了一些关于这个问题的问题后,我只能找到这个和这个,但两者都不允许向搜索函数发送参数(AKA 针(,而是使用预定义的函数并使用array_filter

我搜索了in_array文档,但没有找到。

我想要类似的东西(作为 usort 启用(:

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( - 在某些情况下使用循环和中断或in_array可能是 O(1((仅在最坏的情况下将是 O(n( 但不是全部(

看看一个很棒的 nikic/iter 库。

$haystack = ["AA", "BB", "CC", "DD"];
$needle = "cc";
$found = iterany(function ($value) use ($needle) {
    return strcasecmp($needle, $value);
}, $haystack);

如果你不怕函数式柯里,看看函数式 php 库。

use function Functionalpartial_any;
use function Functionalsome;
use function Functionalplaceholder;
$haystack = ["AA", "BB", "CC", "DD"];
$needle = "cc";
$compareFunc = "strcasecmp";
$found = some($haystack, partial_any($compareFunc, $needle, placeholder()));

该库提供了很好的助手来编写功能更函数式风格的代码,但我建议您在整个项目中使用它或根本不使用它,因为仅要求它用于一两次偶尔使用并没有多大意义。

为此

,您可以使用array_reduce或array_filter返回 0、1 或多个符合您条件的项目。

您可以使用array_mapstrcasecamparray_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"])));

相关内容

  • 没有找到相关文章

最新更新