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

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

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

例如

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

如果比较器看起来像这样

$comp = function ($arrValue, $findValue) {
    return ($arrValue % $findValue) == 0;
};

然后,如果搜索到8,基于比较器的搜索函数将返回true,并且这将是好的,输出找到的元素的索引,即7.

最佳答案 你的意思是这样的:

$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);
}
点赞