繁体   English   中英

使用用户定义的比较函数搜索针in_array

[英]Search needle in_array using a user-defined comparison function

这个问题在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),但并非全部为O)

看看一个很棒的nikic / iter库

$haystack = ["AA", "BB", "CC", "DD"];
$needle = "cc";

$found = \iter\any(function ($value) use ($needle) {
    return strcasecmp($needle, $value);
}, $haystack);

如果您不担心函数泛滥,请看一下functional-php库

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()));

该库提供了很好的助手来编写功能更强的样式的代码,但是我建议您在整个项目中使用它,或者根本不使用它,因为只需要一两次偶尔使用它并不会带来很多好处感。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM