这可能是没有希望但是,有没有办法用我自己的比较器函数搜索数组中的元素?在
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);
}