使用自定义比较器在PHP数组中搜索
这可能是没有希望的,但是,有没有办法用我自己的比较器函数在数组中搜索元素?在PHP中实现它会导致搜索速度变慢,所以可能存在更好的解决方案 我真正想从搜索中得到的是a)了解数组中是否存在元素,b)最好是获取找到的元素的键(索引) 比如说使用自定义比较器在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;
$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);
}