PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

current> <compact
Last updated: Sun, 25 Nov 2007

view this page in

count

(PHP 4, PHP 5)

count — 计算数组中的单元数目或对象中的属性个数

说明

int count ( mixed $var [, int $mode ] )

返回 var 中的单元数目,通常是一个 array,任何其它类型都只有一个单元。

对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。

如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 varNULL 则结果是 0

Note: 可选的 mode 参数自 PHP 4.2.0 起可用。

如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。mode 的默认值是 0count() 识别不了无限递归。

Caution

count() 对没有初始化的变量返回 0,但对于空的数组也会返回 0。用 isset() 来测试变量是否已经初始化。

请参考手册中数组一节中关于怎样在 PHP 中实现和使用数组的详细解释。

Example#1 count() 例子

<?php
$a
[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result count($a);
// $result == 3

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
$result count($b);
// $result == 3;

$result count(null);
// $result == 0

$result count(false);
// $result == 1
?>

Example#2 count() 的递归例子(PHP >= 4.2.0)

<?php
$food 
= array('fruits'  => array('orange''banana''apple'),
              
'veggie'  => array('carrot''collard','pea'));

// recursive count
echo count($foodCOUNT_RECURSIVE);  // output 8

// normal count
echo count($food);                  // output 2
?>

参见 is_array()isset()strlen()



current> <compact
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
count
Anonymous
11-Oct-2008 08:53
redbehelit at yahoo dot com wrote:

-----------------------------------------------
for ($i = 0; $i < count($arr); i++) {

This loop is going to try to traverse to $arr[26] which does not exist. The last element is at index number 25. We can fix this with a minor edit:

for ($i = 0; $i < count($arr)-1; i++) {
------------------------------------------------

That is incorrect.  Even if count IS 26 it won't traverse it because you arre using the < operator.  Think about it : 26 is NOT less than 26...
michael.debyl at gmail dot comz0r
16-Jul-2008 06:45
There doesn't seem to be a succinct method already noted on this page for counting multidimensional array end nodes (Items in multidimensional arrays), so I thought this function might help somebody.

Nice and simple :)

function rcount ($array) {
  $count = 0;
  if (is_array($array)) {
    foreach($array as $id=>$sub) {
    if (!is_array($sub)) { $count++; }
     else { $count = ($count + rcount($sub)); }
    }
    return $count;
  }
  return FALSE;
}
analpaper{gmail}
04-Jul-2008 10:37
I found useful this little function that detects if a array is multidimensional or not.

<?php
function array_is2D($array) {
  return
is_array($array) ? count($array)===count($array, COUNT_RECURSIVE) : -1;
}
?>

---
live2code
macnimble
21-Apr-2008 07:57
In response to yarolan at mail dot ru:

I actually find Duff's Device to be particularly useful in the example put forth by yarolan.
He wrote:
$arr_size=count($arr);
for($i=0;$i<$arr_size;$i++)
{
   ...
}

If the order of processing doesn't matter, I do this:
$i = count($some_array);
while ($i--):
  do_something_to($some_array[$i]);
endwhile;

If it does matter, I like this:
$i = count($some_array);
$some_array = array_reverse($some_array);
while ($i--):
  do_something_to($some_array[$i]);
endwhile;

I have no idea if it's faster as I haven't tested it.
Mostly, I just like the way it looks. ;)
To email me, find me on TheHolierGrail.com or MacNimble.com
Anonymous
11-Jan-2008 05:20
Here is an iterative soloution of danny's count_recursive function which might be more efficient due to the missing recursion

<?php
/**
 * counts elements of an multidimensional array
 *
 * @param array $array Input Array
 * @param int $limit dimensions that shall be considered (-1 means no limit )
 * @return int counted elements
 */
function multicount ($array, $limit = -1)
{
  
$cnt = 0;
  
$limit = $limit > 0 ? (int) $limit : -1;
  
$arrs[] = $array;
   for (
$i=0; isset($arrs[$i]) && is_array($arrs[$i]); ++$i)
   {
      foreach (
$arrs[$i] as $value)
      {
         if (!
is_array($value) ) ++$cnt;
         elseif(
$limit==-1 || $limit>1 )
         {
            if(
$limit>1 ) --$limit;
           
$arrs[] = $value;
         }
      }
   }     
   return
$cnt;
}
?>
Anonymous
17-Nov-2007 12:31
I can confirm Wulfson's comment below.  The for loop should be faster in most situations, just as long as you're iterating through a sequentially indexed array.

In fact, from my experience using foreach to iterate through an associative array is actually slower than using a while loop.

<?php

/* foreach iterator */
foreach($assoc_array as $key => $value) { }

/* while iterator */
while(list($key, $value) = each($assoc_array)) { }

?>
Wulfson at wulfden dot com
03-Nov-2007 05:08
The last two comments (redbehelit and Jaik) are a little misguided. In a 26 element array,

for ($i = 0; $i < count($arr); $i++) {

works just fine, as count($arr) will return 26, which means that the loop will end as soon as $i gets iterated to 26 (26 < 26 is false). You'd only have to use count($arr) - 1 if your conditional was $i <=

Jaik is correct that it's better not to use count() inside the loop construct. As mentioned in a previous comment, it'd be faster to use

$size = count($arr);
for ($i = 0; $i < $size; $i++) {

I don't agree that foreach should be used instead of this, however. In my trials, I found that using a normal for loop was consistently faster than using a foreach (granted, not a whole lot faster, but everything counts if you're trying to optimize). foreach really ought to only be used when the array you're traversing contains associative indices.
Jaik
25-Oct-2007 09:51
The last comment is somewhat inefficient as it runs the count() function at the start of every loop.

The preferred way to iterate through an array would be to use the 'foreach' control structure.
redbehelit at yahoo dot com
17-Oct-2007 03:24
Be careful if you're using count in a loop. Example:

$arr ends at index number 25 (or $arr[25])

We know there are actually 26 elements when we include element 0 (as we should). This is what count is going to return back. But if we do this:

for ($i = 0; $i < count($arr); i++) {

This loop is going to try to traverse to $arr[26] which does not exist. The last element is at index number 25. We can fix this with a minor edit:

for ($i = 0; $i < count($arr)-1; i++) {
atoi_monte at hotmail dot com
29-Jun-2007 05:10
Please note: While SPL is compiled into PHP by default starting with PHP 5, the Countable interface is not available until 5.1
danny at dannymendel dot com
14-Jun-2007 04:14
I actually find the following function more useful when it comes to multidimension arrays when you do not want all levels of the array tree.

// $limit is set to the number of recursions
<?php
function count_recursive ($array, $limit)
{
    foreach (
$array as $id => $_array)
    {
        if (
is_array ($_array) && $limit > 0) $count += count_recursive ($_array, $limit - 1); else $count += 1;
    }
    return
$count;
}
?>
yarolan at mail dot ru
26-Apr-2007 07:56
NEVER USE IN CYCLES!
//size of $arr ~ 2000 elements

//wrong variant (Time exec ~ 19 sec)
for($i=0;$i<count($arr);$i++)
{
   ...
}

//right variant(Time exec ~ 0.2 sec)
$arr_size=count($arr);
for($i=0;$i<$arr_size;$i++)
{
   ...
}

it was discovered experimentally.
Colin
03-Feb-2007 11:24
// countValuesRecursive
// The goal of this function is to count non-false values of a multidimenional array
// This is useful in making a quick determination if a form sent any values
// If no values were sent I can simply return to the blank form rather than continuing to the validation of each input
// There are two limitations of the principle:
// 1. If you WANT to send FALSE, 0, '', or NULL as form values this function will not count those, thus not doing what's expected
// 2. This would create an endless loop on a form that has no required fields such as one where users can choose to recieve optional  email subscriptions but where choosing none is also valid
function countValuesRecursive($array, $count = 0) {
   
    // Cycle through the array
    foreach ($array as $value) {
       
        // Check if the value is an array
        if (is_array($value)) {
           
            // Cycle through deeper level
            $count = countValuesRecursive($value, $count);
            }
        else {
           
            // Check if the value is TRUE
            if ($value) {
                $count++;
                }
            }
        }
   
    // Return the count
    return $count;
    }
alexandr at vladykin dot pp dot ru
08-Nov-2006 08:28
My function returns the number of elements in array for multidimensional arrays subject to depth of array. (Almost COUNT_RECURSIVE, but you can point on which depth you want to plunge).
<?
 
function getArrCount ($arr, $depth=1) {
      if (!
is_array($arr) || !$depth) return 0;
        
    
$res=count($arr);
        
      foreach (
$arr as $in_ar)
        
$res+=getArrCount($in_ar, $depth-1);
     
      return
$res;
  }
?>
anil dot iitk at gmail dot com
26-Jan-2006 04:32
<?php
$food
= array('fruits' => array('orange', 'banana', 'apple'),
            
'veggie' => array('carrot', 'collard', 'pea'));

// recursive count
echo "<br>".count($food, COUNT_RECURSIVE); // output 8

function average($a){
  return
array_sum($a)/count($a) ;
}
$b = array(1,2,3,4,5,6,7,8,9);
echo
"Average of array:".average($b);

?>
Scorch at netpix dot com
20-Dec-2005 09:59
Be careful of recasting your variables, especially with database array returns:

<?php
$res
= mysql_query("select * from blah") // a query that returns an empty set
$row = mysql_fetch_array($res); // get's 0 since there's no return
echo count($row); // echos 1 - since $row is not an array
echo $row[0]; // echos "", but casts $row as an array?
echo count($row); // echos 0 now
?>
Tom
01-Dec-2005 08:57
You can find an average from an array using this and array_sum.
<?php
//array average( array input )
function average($input) {
return
array_sum($input) / count($input);
}
?>

You can also do a method of form validation that involves putting all errors into an array and letting count() do the key part.
<?php
if(isset($_POST['submit'])) {
$errors = array();
if(empty(
$_POST['message'])) $errors[] = "Empty message field";
if(!
preg_match('/[a-z0-9.]@[a-z0-9].[a-z]/i', $_POST['email']) {
$errors[] = "Bad email address";
  }
if(
count($errors) == 0) {
//process form...
 
}
}
?>
Fred D
19-Oct-2005 12:16
The trim_text function was helpful, but it did not take account of the possibility of having nothing to trim which can sometimes happen if you are using this function in a loop through data. I've added a count function to deal with that possibility

------------------------------
function trim_text_elipse($text, $count){
//Create variable
$trimmed="";

//Remove double white space
$text = str_replace("  ", " ", $text);

//Turn the text into an array
$string = explode(" ", $text);

//Check to see how many words there are
$wordTotal = count($string);   
    //Check to see if there are more words than the $count variable
    if($wordTotal > $count){
        //Loop through adding words until the $count variable is reached
        for ( $wordCounter = 0; $wordCounter <= $count; $wordCounter++ ){
            $trimmed .= $string[$wordCounter];
                //Check to and add space or finish with elipse           
                if ( $wordCounter < $count ){ $trimmed .= " "; }
                else { $trimmed .= " &#8230;"; }
                }
    }else{
    //Set value returned to the existing value
    $trimmed =$text;
    }
//Trim off any white space   
$trimmed = trim($trimmed);
return $trimmed;
}

-------------------------------
david _at_ webgroup _dot_ org
13-Feb-2005 08:30
While michael at htmlland dot net's code works, I believe it is better to use:
$extension=substr($file,strrpos($file,".")+1);

This doesn't incur the overhead of array handling.  I haven't tested it for time functions, but it should work just as well and SHOULD be faster.
freefaler at gmail dot com
20-Nov-2004 09:01
If you want to count only elements in the second level of 2D arrays.A close to mind note, useful for multidimentional arrays:

<?php
$food
= array('fruits' => array('orange', 'banana', 'apple'),
            
'veggie' => array('carrot', 'collard','pea'));

// recursive count
echo count($food,COUNT_RECURSIVE);  // output 8

// normal count
echo count($food);                  // output 2

// all the fruits and veggies
echo (count($food,COUNT_RECURSIVE)-count($food,0)); //output 6
?>
moazzam at ummah dot org
15-Oct-2004 07:59
This is an obvious note, but I am writing it any way so other, who did may not have observed this, can take advantage of it too.

When running loops with count conditions, the code runs faster if you first assign the count() value to a variable and use that (instead of using count() directly in a loop condition.

To explain my point better, here is an example:

<?php

for ($i=0; $i<10000; $i++) {
   
$arr[] = $i;
}

$time11 = microtime_float();
$bf = "";
for (
$i=0; $i<count($arr); $i++) {
   
$bf .= $arr[$i]."\n";
}
$time12 = microtime_float();
$time1 = $time12 - $time11;

print
"First: ".$time1."\n";

$time21 = microtime_float();
$l = count($arr);
for (
$i=0; $i<$l; $i++) {
   
$bf .= $arr[$i]."\n";
}
$time22 = microtime_float();
$time2 = $time22 - $time21;

print
"Second: ".$time2."\n";

?>

The output from the code above is (when run many times):

First: 0.13001585006714
Second: 0.099159002304077

First: 0.12128901481628
Second: 0.079941987991333

First: 0.18690299987793
Second: 0.13346600532532

As you can see, the second method (which doesnt use count() directly in the loop) is faster than the first method (which uses count() directly in the loop).

BTW:  I copied the microtime_float() function from one of the comments in the microtime() section. It just returns time with microseconds as float. Check comments in microtime() for more info.
michael at htmlland dot net
05-Jun-2004 01:30
I have found on upload scripts or on file manipulation scripts that people can trick a classic file type filter:
example:
$filename="bob.jpg.wav";
$bits= explode(".",$filename);
$extention= $bits[1];
if($extention == "jpg"){ echo"Not correct"; exit; }

This returns the filename extention as jpg not wav.

One way to change this is to use count() :
example:
$filename="bob.jpg.wav";
$bits= explode(".",$filename);
$extention= $bits[count($bits) - 1];
if($extention == "jpg"){ echo"Not correct"; exit; }

This returns the filename extention as wav not jpg.
rolandfoxx at yahoo dot com
31-Mar-2004 08:13
As an addition, any of the array manipulation functions can likewise get count to once again return 0:

<?php
$a
= array();
print(
count($a)); // prints 0
$a[0] = "foo";
array_shift($a);
print(
count($a)); //prints 0
$a[0] = "bar";
array_splice($a, 0, 1);
print(
count($a)); //prints 0
?>
admin at lft-muenchen dot de
12-Mar-2003 08:18
Note:
print (strlen($a)); // will print 0
$a="";
print (strlen($a)); // will print 1
$a=null;
print (strlen($a)); // will print 1
$a=array();
print (strlen($a)); // will print 0

you can only get an array back to size 0 by using the array() command, not by just setting it to "" or null.
simon at invalid dot com
20-Aug-2002 03:40
Reminder for using count():

<?php
$ary
= array(null, "a", "b", null);
echo
count($ary);    // count: 4

$ary[10] = "c";
echo
count($ary);    // count: 5

$ary[15] = null;
echo
count($ary);    // count: 6
?>

=> NULL is seen as an element in count()

Count 2D array:

<?php
$a2Dary
= array(array("a", "b") , array(), "v");

echo
count($a2Dary);        // count: 3
echo count($a2Dary[0]);    //count 2
echo count($a2Dary[1]);    // count: 0
echo count($a2Dary[2]);    // count: 1
?>

Hope can help you
09-Jul-2002 12:18
Perhaps change the wording of this description from "Count elements in a variable" to "Count total elements in a variable" as it may be interpreted (by me) as a function for counting specific elements (ie, number of substrings)
webmaster at NOSPAMtrafficg dot com
26-Apr-2002 06:48
Counting a multi-dimentional array

test array

<?php
$settings
[0][0]  = 128;
$settings[0][1]  = 256;
$settings[0][2]  = 384;
$settings[0][3]  = 512;
$settings[0][4]  = 1024;
$settings[0][5]  = 2048;

$settings[1][0]  = 1024;
$settings[1][1]  = 2048;
$settings[1][2]  = 3072;
$settings[1][3]  = 4096;

count($settings) // returns 2
count($settings[0]) // returns 6
count($settings[1]) // returns 4
?>
07-Feb-2002 10:01
<?php
count
(false) ==1
?>

this has tripped me up before...
kanareykin at denison dot edu
27-Mar-2001 05:13
Here's how to count non-empty elements
in an array of any dimension. Hope
it will be useful for somebody.

<?php
// recursively count all non-empty elements
// in array of any dimension or mixed - i.e.
// array('1' => 2, '2' => array('1' => 3, '2' => 4))
function count_all($arg)
{
   
// skip if argument is empty
   
if ($arg)    {
       
// not an array, return 1 (base case)
       
if(!is_array($arg))
            return
1;
       
// else call recursively for all elements $arg
       
foreach($arg as $key => $val)
           
$count += count_all($val);
           
        return
$count;       
    }
}
?>
martin at complinet dot com
30-Nov-2000 08:31
The count function does not ignore null values in an array. To achieve this use this function.

<?php
function xcount($array) {
        while (list(
$key, $value) = each($array)) {
                if (
$value) {
                       
$count++;
                }
        }
return
$count;
}
?>
jmcastagnetto at php dot net
05-Sep-2000 03:30
If you want to disambiguate if a variable contains an array w/ only one element, just us is_array() or gettype()
legobuff at hotmail dot com
03-Feb-2000 02:43
This is taken from sganer@expio.co.nz comments on the sizeof() function:
If some elements in your array are not set, then sizeof() and count() will not return the index of the last element, but will return the number of set elements. To find the index of the last element in the array:

end($yourArray);
$index = key($yourArray);

... Where $yourArray is the array you want to find the last index ($index) of.

current> <compact
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites