2013-08-26 3 views
1

Est-il possible de compter des entiers dans un tableau correspondant à un critère (par exemple inférieur à n) sans boucle foreach?Existe-t-il un moyen de comptabiliser des entiers dans un tableau inférieur à un point donné sans boucle 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; 
} 
+0

vous ne pouvez pas le faire sans instruction else else dans une boucle –

+3

Vous pouvez trier le tableau et trouver la position du nombre. – cars10m

+0

Le tableau est-il trié? Ou contraint de quelque façon que ce soit? –

Répondre

7

Une méthode générique peut être utilisation de la fonction array_filter qui crée un tableau d'éléments répondant à certains critères n comme nom de la fonction)

par exemple pour compter le nombre d'éléments dans le tableau plus grand que 3 on peut exécuter

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

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

qui imprime

2 

Mais il est évident - sans aucune restriction sur le critère et/ou array - n'importe quelle solution utilisera une boucle "sous le capot" (et fournit également des boucles de réponse, mais en utilisant simplement les fonctions prédéfinies du langage).

+1

+ "sous le capot". –

1

Désolé pas array_map() mais array_filter() comme ceci:

$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; 
} 

imprimera:

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

voir plus ici: http://www.php.net/manual/en/function.array-filter.php

+0

Je ne suis pas. http://codepad.org/VQK6Xj4B – Ryan

+0

maintenant cela fonctionne très bien, vous pouvez changer le <4 pour <'toute valeur que vous voulez' – Tiago

1

Si le tri du tableau est permis:

(tri en lui-même est bien sûr pas toujours pas cher et implique en interne des boucles de toute façon)

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

autrement:

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

Mais, encore une fois: Cela ne fonctionne que si$nest en fait un membre de$arr, sinon vous obtiendrez un mauvais résultat! Pour les cas où $n ne fait pas partie du tableau, vous pouvez essayer une approche arborescente en choisissant un point au milieu du tableau original, puis en vérifiant si la valeur est supérieure ou inférieure à $n puis récursivement répéter le processus sur la moitié restante du tableau. La récursion est terminée lorsque la longueur d'un tableau est 1. La position trouvée est fondamentalement le nombre que vous recherchez.

+0

Je vais avoir du mal à faire ce travail: http://codepad.org/t35b1R0h – Ryan

+0

Essayez ce violon: http://phpfiddle.org/main/code/4x9-xrp (j'ai ajouté quelques éléments à la tableau). – cars10m

Questions connexes