基本上,我希望能够获得C ++ find_if()
,Smalltalkdetect:
等的功能:
// would return the element or null
check_in_array($myArray, function($element) { return $elemnt->foo() > 10; });
但是我不知道有任何PHP函数可以做到这一点。我想到了一个“近似”:
$check = array_filter($myArray, function($element) { ... });
if ($check)
//...
不利的一面是该代码的用途尚不清楚。同样,即使找到了元素,它也不会停止在数组上进行迭代,尽管这更多的是挑剔(如果数据集足够大以至于会引起问题,则线性搜索将永远不是答案)
您可以编写自己的函数;)
function callback_search ($array, $callback) { // name may vary
return array_filter($array, $callback);
}
这似乎没有用,但是它增加了语义并且可以提高可读性
要从数组中提取第一个,或返回false
:
current(array_filter($myArray, function($element) { ... }))
这是一个基本的解决方案
function array_find($xs, $f) {
foreach ($xs as $x) {
if (call_user_func($f, $x) === true)
return $x;
}
return null;
}
array_find([1,2,3,4,5,6], function($x) { return $x > 4; }); // 5
array_find([1,2,3,4,5,6], function($x) { return $x > 10; }); // null
在活动$f($x)
的回报true
,回路短路并$x
立即返回。与相比array_filter
,这对我们的用例更好,因为array_find
在找到第一个肯定匹配之后不必继续进行迭代。
如果回调从不返回true,null
则返回值。
请注意,我使用call_user_func($f, $x)
的不仅仅是调用$f($x)
。这在这里是适当的,因为它允许您使用任何兼容的可调用对象
Class Foo {
static private $data = 'z';
static public function match($x) {
return $x === self::$data;
}
}
array_find(['x', 'y', 'z', 1, 2, 3], ['Foo', 'match']); // 'z'
当然,它也适用于更复杂的数据结构
$data = [
(object) ['id' => 1, 'value' => 'x'],
(object) ['id' => 2, 'value' => 'y'],
(object) ['id' => 3, 'value' => 'z']
];
array_find($data, function($x) { return $x->id === 3; });
// stdClass Object (
// [id] => 3
// [value] => z
// )
如果您使用的是PHP 7,请添加一些类型提示
function array_find(array $xs, callable $f) { ...
原始array_search
值返回匹配值的键,而不是值本身(如果您以后要更改原始数组,这可能会很有用)。
试试这个功能(它也将关联数组工作)
function array_search_func(array $arr, $func)
{
foreach ($arr as $key => $v)
if ($func($v))
return $key;
return false;
}
使用\iter\search()
nikic的原始迭代函数的iter库。它具有在数组和 Traversable
集合上运行的附加好处。
$foundItem = \iter\search(function ($item) {
return $item > 10;
}, range(1, 20));
if ($foundItem !== null) {
echo $foundItem; // 11
}
您可以自己编写这样的函数,尽管它仅仅是一个循环。
例如,此函数允许您传递回调函数。回调可以返回0或一个值。如果回调大于10,我指定的回调将返回整数。当回调返回非null值时,函数将停止。
function check_in_array(array $array, $callback)
{
foreach($array as $item)
{
$value = call_user_func($callback, $item);
if ($value !== null)
return $value;
}
}
$a = array(1, 2, 3, 6, 9, 11, 15);
echo check_in_array($a, function($i){ return ($i > 10?$i:null); });
本文地址:http://php.askforanswer.com/shiyongyonghudingyidehanshusousuophpshuzudejuejiafangfa.html
文章标签:collections , functional-programming , php
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
文章标签:collections , functional-programming , php
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!