Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用用户定义的比较函数在_数组中搜索指针_Php_Arrays_Search - Fatal编程技术网

Php 使用用户定义的比较函数在_数组中搜索指针

Php 使用用户定义的比较函数在_数组中搜索指针,php,arrays,search,Php,Arrays,Search,在搜索关于此问题的一些问题后,我只能找到和,但两者都不允许向搜索函数发送参数(AKA needle),而是使用预定义函数和array\u filter 我搜索了一下,但没有找到 我想要一些类似(as enable)的东西: 我通过简单的foreach循环来实现它: function uin_array($haystack, $needle, $compareFunc) { foreach($haystack as $e) { if ($compareFunc($needl

在搜索关于此问题的一些问题后,我只能找到和,但两者都不允许向搜索函数发送参数(AKA needle),而是使用预定义函数和
array\u filter

我搜索了一下,但没有找到

我想要一些类似(as enable)的东西:

我通过简单的
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\u filter
作为:
current(array\u filter($haystack,function($element)use($needle){…}))
但在所有的情况下都是O(n)

为此,使用循环和中断或在某种情况下数组可能是O(1)(仅在最坏的情况下是O(n),而不是所有情况下都是O(n)

,您可以使用array\u reduce或array\u filter返回0个、1个或多个符合您的条件的项目。

查看一个很棒的示例


您可以使用
array\u-map
strcasecamp
array\u-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"])));

如果你不害怕函数套用,看看


该库提供了很好的助手,可以编写更具功能性的代码,但我建议您在整个项目中使用它,或者根本不使用它,因为仅在一两次偶尔使用时需要它并没有多大意义。

array\u filter
?我知道我可以做一些类似于
current(array\u filter($haystack,function>)的事情($element)使用($needle){…}))
但在所有情况下都是
O(n)
在_数组中使用循环和中断或
在某些情况下可能是
O(1)
(仅在最坏的情况下是
O(n)
您在问题中提供的函数是最好的解决方案。Core php在_array
中没有任何用户定义的
变体。这些函数将检查数组的所有元素。而OP已经提供的函数将在找到所需项后中断。我建议的想法是检查数组的所有元素数组确实如此。这样,如果你有多个匹配项,你可以找到所有匹配项。如果只是想找到第一个匹配项,那么这些匹配项就不好了。这个问题提出了一个合理的需求,需要有一个PHP扩展,它可以做到这一点,以后可以引入PHP核心。我知道,我有一个类似于问题(编辑部分)中的示例.我正在寻找比这更有效的解决方案。目前@AlexeyShokov的答案是最好的,但我正在等待,看看是否有人能想出更好的解决方案one@dWinder您在这里谈论的是用户定义的比较,但在解决方案中,他使用stracecmp作为静态?用户可以在哪里更改比较函数?我猜是c将用作:
$found=\iter\any(函数($value)use($needle,$compareFunc){return$compareFunc($needle,$value);},$haystack);
我无法执行此命令,因为“致命错误:未捕获错误:调用未定义的函数iter\any()”我明白了,需要使用Library迄今为止最好的答案。我建议将其编辑为
$found=\iter\any(函数($value)use($needle,$compareFunc){return$compareFunc($needle,$value);},$haystack);
因此,比较函数可以是参数并添加
使用iter\fn;
向上投票。我仍在等待其他人是否会接受更好的答案。是的,如果你想灵活使用
$compareFunc
,请参阅我的第二个答案,使用
函数式php
lib示例这也是一个不错的答案,向上投票-但我正在搜索php核心功能(可能不存在)-所以不完全是我想要的。谢谢!
$haystack = ["AA", "BB", "CC", "DD"];
$needle = "cc";

$found = \iter\any(function ($value) use ($needle) {
    return strcasecmp($needle, $value);
}, $haystack);
$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"])));
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()));