2009-08-23 15 views
21

Decir que tengo una serie como esta:Contar el número de valores en la matriz con un valor dado

$array = array('', '', 'other', '', 'other'); 

¿Cómo puedo contar el número con un valor dado (en el ejemplo blanco)?

¿Y hacerlo de manera eficiente? (Por alrededor de una docena de matrices con cientos de elementos de cada uno) En este ejemplo el tiempo de espera (durante 30 s):

function without($array) { 
    $counter = 0; 
    for($i = 0, $e = count($array); $i < $e; $i++) { 
     if(empty($array[$i])) { 
      $counter += 1; 
     } 
    } 
    return $counter; 
} 

En este caso el número de elementos en blanco es 3.

+0

Cellfish: array_count_values ​​funciona, pero el script que normalmente tarda de 1 a 2 segundos en ejecutarse ¡tardó casi 20 segundos! Johnathan: array_keys no funcionó para esta función en particular. Steve: array_reduce también funciona pero no tan rápido como me gustaría. Manzanilla: Simplemente cambiando $ valor === '' a vacío ($ valor) que resultó ser la manera más rápida de hacer esto. función sin ($ array) { $ count = 0; foreach ($ array as $ value) { if (empty ($ value)) { $ count ++; } } return $ count; } – Tom

Respuesta

26

Sólo una idea, podría usar array_keys($myArray, "") usando el segundo parámetro opcional que especifica un valor de búsqueda. Luego cuente el resultado.

$myArray = array("","","other","","other"); 
$length = count(array_keys($myArray, "")); 
+0

Esta es una gran alternativa, especialmente si se trata de valores booleanos. –

6

No sé si esto sería más rápido pero es algo para tratar:

$counter = 0; 
foreach($array as $value) 
{ 
    if($value === '') 
    $counter++; 
} 
echo $counter; 
3

También puede probar array_reduce, con una función que acaba de contar el valor que interesa. Ej

function is_empty($v, $w) 
{ return empty($w) ? ($v + 1) : $v; } 

array_reduce($array, 'is_empty', 0); 

Algunos evaluación comparativa podría decir si esto es más rápido que array_count_values ​​()

-2
function arrayvaluecount($array) { 

    $counter = 0; 
    foreach($array as $val){ 

     list($v)=$val; 
     if($v){ 

     $counter =$counter+1; 
     } 

    } 
return $counter; 
} 
+4

¿Podría explicar su código en inglés también editando su respuesta? – Ben

+2

Por favor explique su código al OP y para los lectores futuros. –

2

Utilizamos array_filter función para averiguar número de valores en la matriz

$array=array('','','other','','other'); 
$filled_array=array_filter($array);// will return only filled values 
$count=count($filled_array); 
echo $count;// returns array count 
-1
function countarray($array) 
{  $count=count($array);   
     return $count;   
}   
$test=$array = array('', '', 'other', '', 'other');   
echo countarray($test); 
+0

$ array = array ('', '', 'otro', '', 'otro'); $ filled_array = array_filter ($ array); // devolverá solo los valores llenos $ count = count ($ filled_array); echo $ count; // devuelve el recuento de matriz –

1

Generalmente solo para contar los espacios en blanco. Realmente depende del caso de uso y la velocidad necesaria. Personalmente, me gusta hacer cosas en una línea.

Sin embargo, como la respuesta elegida Pero aún necesita una línea para extraer los datos necesarios a otra variable.

$r = count($x) - count(array_filter($x)); 
+0

O use la devolución de llamada: count (array_filter ($ x, function ($ v) {return '' === $ v;})) –

Cuestiones relacionadas