1

n是否可以在没有 foreach 循环的情况下计算符合条件(例如小于)的数组中的整数?

$arr = range(0,100); // not always consistent 0,1,2,3...100.  Could be 1,1,3,5,25,6,10,100.
$n = 20;
echo countLessThan($n,$arr); // can this work without a loop?
echo countLessLoop($n,$arr); // works, with the help of a loop

// can you make this work without a loop?
function countLessThan($n,$arr) {
    $count = ?; // number of items in $arr below $n
    return $count;
}

// this works, but with a loop
function countLessLoop($n,$arr) {
    $count = 0;
    foreach($arr as $v) {
        if ($v < $n) $count++;
    }
    return $count;
}
4

3 回答 3

7

一种通用方法可以使用array_filter创建满足某些标准的元素数组的函数(作为函数名称给出)

例如,要计算数组中大于 3 的元素数,可以运行

function test($x){
 return $x>3; 
}

$data = array( 1,2,3,4,5 );
echo count( array_filter( $data, 'test' ) );

哪个打印

2

但显然 - 对标准和/或数组没有任何限制 - 任何解决方案都将使用“幕后”循环(并且提供的答案也循环,但只是使用语言预定义的函数)。

于 2013-08-26T14:32:27.750 回答
1

如果允许对数组进行排序:

(当然,排序本身并不总是很便宜,而且内部无论如何都会涉及一些循环)

function countLessThan($n,$arr){
  sort($arr);
  return array_search ($n,$arr);
}

否则:

function countLessThan($n,$arr){
  $a=array_slice($arr,0);
  sort($a);
  return array_search ($n,$a);
}

但是,话又说回来:这只有效,如果 $n 它实际上是 的成员 $arr,否则你会得到错误的结果!

对于 where$n不是数组的一部分的情况,您可能希望通过在原始数组的中间选择一个点来尝试树方法,然后检查该值是高于还是低于$n,然后递归地在剩余的数组上重复该过程数组的一半。当数组的长度为1时,递归结束。找到的位置基本上就是你要找的数字。

于 2013-08-26T14:45:25.053 回答
1

对不起,不是 array_map() 而是 array_filter() 像这样:

$array = array('1', '2', '3', '4', '5', '5');
print_r(array_filter($array,"lessthen"));
function lessthen($val) {
    if ($val<4) {
        return $val;    
    }
    else return NULL;
}

将打印:

Array ( [0] => 1 [1] => 2 [2] => 3 )

在这里查看更多信息:http ://www.php.net/manual/en/function.array-filter.php

于 2013-08-26T14:31:28.950 回答