使用自定义比较器在PHP数组中搜索

使用自定义比较器在PHP数组中搜索,php,search,Php,Search,这可能是没有希望的,但是,有没有办法用我自己的比较器函数在数组中搜索元素?在PHP中实现它会导致搜索速度变慢,所以可能存在更好的解决方案 我真正想从搜索中得到的是a)了解数组中是否存在元素,b)最好是获取找到的元素的键(索引) 比如说 $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 如果比较器是这样的 $comp = function ($arrValue, $findValue) { return ($arrValue % $findValue) == 0;

这可能是没有希望的,但是,有没有办法用我自己的比较器函数在数组中搜索元素?在PHP中实现它会导致搜索速度变慢,所以可能存在更好的解决方案

我真正想从搜索中得到的是a)了解数组中是否存在元素,b)最好是获取找到的元素的键(索引)

比如说

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
如果比较器是这样的

$comp = function ($arrValue, $findValue) {
    return ($arrValue % $findValue) == 0;
};
然后,如果搜索了
8
,则基于比较器的搜索函数将返回
true
,并输出找到的元素的索引,即
7

我认为
array\u search()
就是您要寻找的。array_search-在数组中搜索给定值,如果成功,则返回相应的键。我认为这与您在原始问题a)和b)中试图实现的目标是一致的

性能:


数组搜索是O(n)。

您的意思是:

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$findValue = 8;

$result = array_filter(
    $arr, 
    function ($arrValue) use($findValue) {
        return ($arrValue % $findValue) == 0;
    }
);
编辑

也许你的意思更像:

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$findValue = 3;

foreach(array_filter(
    $arr, 
    function ($arrValue) use($findValue) {
        return ($arrValue % $findValue) == 0;
    }
) as $key => $value) {
    echo $value, ' is a multiple of ', $findValue, PHP_EOL;
}
编辑#2

或者你是说更复杂的东西,比如:

function filter($values, $function) {
    return array_filter(
        $values,
        $function
    );
}

$isEven = function ($value) {
    return !($value & 1);
};

$isOdd = function ($value) {
    return $value & 1;
};

$data = range(1,10);

echo 'array_filter() for Odds', PHP_EOL;
var_dump(
    filter(
        $data,
        $isOdd
    )
);

echo 'array_filter() for Evens', PHP_EOL;
var_dump(
    filter(
        $data,
        $isEven
    )
);
也可以使用PHP 5.5生成器:

$isEven = function ($value) {
    return !($value & 1);
};

$isOdd = function ($value) {
    return $value & 1;
};

function xFilter(callable $callback, $args=array()) {
    foreach($args as $arg) {
        if (call_user_func($callback, $arg)) {
            yield $arg;
        }
    }
}

echo 'xFilter for Odds', PHP_EOL;
foreach(xFilter($isOdd, range(1,10)) as $i) {
    echo('num is: '.$i.PHP_EOL);
}

echo 'xFilter for Evens', PHP_EOL;
foreach(xFilter($isEven, range(1,10)) as $i) {
    echo('num is: '.$i.PHP_EOL);
}

查看如何使用
array\u filter()
。。。但也许你想做的更多细节会帮助你得到更详细的答案是的,这(可能不会比写循环快很多)@MarkBaker你今天早上的每一条评论都比我早几秒钟。@MichaelBerkowski-很幸运你也可以使用array_walk();是的,沿着这条路线。我刚刚测试了这种方法,将其与普通的
foreach
解决方案进行比较,
foreach
结果更快..foreach会更快,区别在于回调提供了更多flexibility@MarkBaker我可以在我的搜索函数中使用foreach回调,不是吗?我明白了,很好的一个标记。我不知道如何让foreach()使用回调,我真的很难理解您在这里提出的问题。。。foreach()只在其{和}之间执行一个代码块
$isEven = function ($value) {
    return !($value & 1);
};

$isOdd = function ($value) {
    return $value & 1;
};

function xFilter(callable $callback, $args=array()) {
    foreach($args as $arg) {
        if (call_user_func($callback, $arg)) {
            yield $arg;
        }
    }
}

echo 'xFilter for Odds', PHP_EOL;
foreach(xFilter($isOdd, range(1,10)) as $i) {
    echo('num is: '.$i.PHP_EOL);
}

echo 'xFilter for Evens', PHP_EOL;
foreach(xFilter($isEven, range(1,10)) as $i) {
    echo('num is: '.$i.PHP_EOL);
}