您的位置:

php计数函数count,php 函数

本文目录一览:

php中count()函数的作用?

PHP中count() 函数表示:计算数组中元素的个数,或者计算对象中属性的个数;

计算数组元素个数示例:

?php

$arr = array("baidu", "google", "soso");

echo count($arr);

//结果:3

?

计算对象中的属性个数示例:

?php

class Person{

    public $name;

    public $age;

    

    public  function __construct(){

        $this-name    = 'baiduzhidao';

        $this-age = '10';

    }

    function msg(){

        echo "msg function.";

    }

}

//new 对象

$per= new Person();

//获取对象属性关联数组

$var=get_object_vars($per);

//计算对象属性个数

echo count($var);

//输出结果为:2

?

php中统计数组的长度是那个函数?

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!展开全部

获取一维数组:

count()和sizeof() 都可以直接统计一维数组长度。示例如下:

$arr = Array('0','1','2','3','4','5','6','7','8','9'); echo count($arr); // 输出10

$arr = array('苹果','香蕉','桔子','西瓜','梨','葡萄'); echo sizeof($arr); // 输出6

获取二维数组长度:

count()函数有两个参数:

count($arr,COUNT_NORMAL); //默认,不检测多维数组

count($arr,COUNT_RECURSIVE); //检测多维数组

例子:

$arr = array(

0=array('name'='kong','age'='18'),

1=array('name'='liang','age'='30')

);

count($arr) = 2;

count($arr,COUNT_RECURSIVE) = 6;非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

php count函数使用问题

如果你单纯是要计算查询出的行数

用$num

=

mysql_num_rows($R1);就可以了

如果是别的,加我BAIDU

HI吧,一起讨论一下

其实你print_r($select);你就会发现你的数组是6个数据,因为mysql_fetch_array()的语法是这样的

array

mysql_fetch_array

(

resource

result

[,

int

result_type]

)

也就是说第二个参数可以取三个值MYSQL_NUM,MYSQL_ASSOC,MYSQL_BOTH(默认)

他们的意思分别是键名取数字,键名取字段名,全部

所以,你数据库选择了3个列,那$select等于就取了6个数据

(如:

[0]=1

[id]=1

[1]=2

[name]=2

[2]=3

[password]=3)

存入数组,如果是$select

=

mysql_fetch_array($R1,MYSQL_ASSOC),那么count($select)就是3

(如:

[id]=1

[name]=2

[password]=3)

MYSQL_NUM同理

至于你说为什么只计算出6,因为取数据值需要循环,即

while($row

=

mysql_fetch_array($R1,MYSQL_ASSOC))

{

$num

+=

count($row);

}

echo

$num;

$num应该就是你想要的结果

php中计算二维数组中某一元素之和的函数是那个啊?谢谢……

PHP数组的总结(很全面啊)

一、什么是数组

数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。数组的每个实体都包含两项:键和值。

二、声明数据

在PHP中声明数组的方式主要有两种:一是应用array()函数声明数组,一是直接为数组元素赋值。

1array()函数声明的数

一、什么是数组

数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。数组的每个实体都包含两项:键和值。

二、声明数据

在PHP中声明数组的方式主要有两种:一是应用array()函数声明数组,一是直接为数组元素赋值。

1array()函数声明的数组的方式array([mixed...])

参数mixed的语法为key=value

如,?php

$array=array("1"="编","2"="程","3"="词","4"="典");

print_r($array);

echo

"br";

echo

$array[1];

//注意:下标默认是从0开始

echo

$array[2];

echo

$array[3];

echo

$array[4];

?

2直接为数组元素赋值。如果在创建数组时不知所创建数组的大小,或在实际编写程序时数组的大小可能发生变化,采用这种数组创建的方法较好。

如,?php

$array[1]="I";

$array[2]="love";

$array[3]="PHP";

print_r($array);

//输出所创建数组的结构

?

三、数组的类型

PHP支持两种数组:索引数组(indexed

array)和联合数组(associative

array),前者使用数字作为键,后者使用字符串作为键。

四、输出数组

在PHP中对数组元素输出,可以通过echo和print语句来实现,但这只能对数组中某一元素进行输出;要将数组结构输出则要使用print_r()函数,其语法:print_r(mixed

expression),参数expression为普通的整形、字符型或实型变量则输出该变量本身,如果该参数为数组,则按一定键值和元素的顺序显示出该数组中的所有元素。

五、数组的构造

一维数组:

当一个数组的元素是变量时,则称其为一维数组。

声明一位数组:

类型说明符

数组名[常量表达式];

二维数组:

当一个数组的元素是一个一位数组时,则称之为二维数组。

如,?php

$str

=

array

(

"网络编程语言"=array

("PHP","JSP","ASP"),

"体育项目"=array

("m"="足球","n"="篮球"));

print_r

(

$str)

;

?

六、遍历数组

遍历数组中的所有元素是常用的一种操作,在遍历的过程中可以完成查询或其他功能。在PHP中遍历数组的方法有多种,下面介绍最常用的两种方法。

1使用foreach结构遍历数组;

2使用list()函数遍历数组,list()函数仅能用于数字索引的数组,且数字索引从0开始。

例:综合使用list()和each()认证用户登录:

?php

//输出用户登录信息

while(list($name,$value)=each($_POST)){

if($name!="submit"){

echo

"$name=$valuebr";

}

}

?

七、统计数组元素个数

在PHP中,使用count()函数对数组中的元素个数进行统计,语法为:int

coun(mixed

array[,int

mode]),其中参数array为必要参数,mode为可选参数,若选中COUNT——RECURSIVE(或1),本函数将递归地对数组数组。如,

?php

$array

=

array("php"

=

array("PHP函数参考大全","PHP程序开发范例宝典","PHP数据库系统开发完全手册"),

"asp"

=

array("ASP经验技巧宝典")

);

//声明一个二维数组

echo

count($array,COUNT_RECURSIVE);//递归统计数组元素的个数,运行结果为6

?

八、数组排序

1使用sort()和rsort()分别对数组进行升序和降序,如,

?php

$array=array(5,26,37,18,9,42,88,66);

$array1=sort($array);

for($i=0;$icount($array);$i++){

echo

$array[$i]." ";

}

echo

"br";

$array1=rsort($array);

for($i=0;$icount($array);$i++){

echo

$array[$i]." nbsp";

}

?

运行结果:

5

9

18

26

37

42

66

88

88

66

42

37

26

18

9

5

2使用ksort()和asort()对关联数组排序

如果使用了相关数组,在排序后还要保持关键字和值的排序一致,这是就需要使用ksort()和asort()函

数,如,

?php

$array=array('php'=1,'jsp'=2,'asp'=3);

ksort($array);

print_r($array);

echo

"br";

asort($array);

print_r($array);

?

运行结果:

Array

(

[asp]

=

3

[jsp]

=

2

[php]

=

1

)

Array

(

[php]

=

1

[jsp]

=

2

[asp]

=

3

)

PHP的count(数组)和strlen(字符串)的内部实现。

翻了下PHP内核的定义,大概心中也有了答案了

count()和strlen()都是O(1)的时间复杂度

试想一下如果strlen()需要O(N)的复杂度那未免也太慢了,字符串长度起来的话服务器不是要直接挂掉吗

这两个函数都是典型的空间换时间的做法

我们可以先看看zvalue的结构:

typedef union _zvalue_value {

   long lval;             /* long value */

   double dval;            /* double value */

   struct {

      char *val;

      int len;

   } str;

   HashTable *ht;          /* hash table value */

   zend_object_value obj;

   zend_ast *ast;

} zvalue_value;

这里用的是一个联合体,当变量类型是string类型的时候附加存储多了一个len的整型变量,显而易见需要取长度直接利用记录值就可以了,自然就是O(1)

对于count()常用的参数类型应该为数组,对于继承Countable的类暂不作讨论

数组实现方式为Hashtable,直接看看他的结构吧

typedef struct _hashtable { 

    uint nTableSize;        // hash Bucket的大小,最小为8,以2x增长。

    uint nTableMask;        // nTableSize-1 , 索引取值的优化

    uint nNumOfElements;    // hash Bucket中当前存在的元素个数,count()函数会直接返回此值 

    ulong nNextFreeElement; // 下一个数字索引的位置

    Bucket *pInternalPointer;   // 当前遍历的指针(foreach比for快的原因之一)

    Bucket *pListHead;          // 存储数组头元素指针

    Bucket *pListTail;          // 存储数组尾元素指针

    Bucket **arBuckets;         // 存储hash数组

    dtor_func_t pDestructor;    // 在删除元素时执行的回调函数,用于资源的释放

    zend_bool persistent;       //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。

    unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归)

    zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次

#if ZEND_DEBUG

    int inconsistent;

#endif

} HashTable;

count直接获取nNumOfElements大小,所以也是O(1)

补充------------------------------------------------

count() 函数的定义在这里

/* {{{ proto int count(mixed var [, int mode])

   Count the number of elements in a variable (usually an array) */

PHP_FUNCTION(count)

{

    zval *array;

    zend_long mode = COUNT_NORMAL;

    zend_long cnt;

    zval *element;

    ZEND_PARSE_PARAMETERS_START(1, 2)

        Z_PARAM_ZVAL(array)

        Z_PARAM_OPTIONAL

        Z_PARAM_LONG(mode)

    ZEND_PARSE_PARAMETERS_END();

    switch (Z_TYPE_P(array)) {

        case IS_NULL:

            php_error_docref(NULL, E_WARNING, "Parameter must be an array or an object that implements Countable");

            RETURN_LONG(0);

            break;

        case IS_ARRAY:

            if (mode != COUNT_RECURSIVE) {

                //类型为数组时调用zend内核函数 zend_array_count()

                cnt = zend_array_count(Z_ARRVAL_P(array));

            } else {

                cnt = php_count_recursive(Z_ARRVAL_P(array));

            }

            RETURN_LONG(cnt);

            break;

        case IS_OBJECT: {

            zval retval;

            /* first, we check if the handler is defined */

            if (Z_OBJ_HT_P(array)-count_elements) {

                RETVAL_LONG(1);

                if (SUCCESS == Z_OBJ_HT(*array)-count_elements(array, Z_LVAL_P(return_value))) {

                    return;

                }

            }

            /* if not and the object implements Countable we call its count() method */

            if (instanceof_function(Z_OBJCE_P(array), zend_ce_countable)) {

                zend_call_method_with_0_params(array, NULL, NULL, "count", retval);

                if (Z_TYPE(retval) != IS_UNDEF) {

                    RETVAL_LONG(zval_get_long(retval));

                    zval_ptr_dtor(retval);

                }

                return;

            }

            /* If There's no handler and it doesn't implement Countable then add a warning */

            php_error_docref(NULL, E_WARNING, "Parameter must be an array or an object that implements Countable");

            RETURN_LONG(1);

            break;

        }

        default:

            php_error_docref(NULL, E_WARNING, "Parameter must be an array or an object that implements Countable");

            RETURN_LONG(1);

            break;

    }

}

如果没有特别指定mode参数为 COUNT_RECURSIVE 的话(即作遍历),跳转到 zend 的数组计数函数 zend_array_count()

#define zend_hash_num_elements(ht) \

    (ht)-nNumOfElements

...

...

static uint32_t zend_array_recalc_elements(HashTable *ht)

{

    zval *val;

    uint32_t num = ht-nNumOfElements;

    

           ZEND_HASH_FOREACH_VAL(ht, val) {

               if (Z_TYPE_P(val) == IS_INDIRECT) {

                   if (UNEXPECTED(Z_TYPE_P(Z_INDIRECT_P(val)) == IS_UNDEF)) {

                       num--;

                   }

               }

    } ZEND_HASH_FOREACH_END();

    return num;

}

ZEND_API uint32_t zend_array_count(HashTable *ht)

{

    uint32_t num;

    if (UNEXPECTED(ht-u.v.flags  HASH_FLAG_HAS_EMPTY_IND)) {

        num = zend_array_recalc_elements(ht);

        if (UNEXPECTED(ht-nNumOfElements == num)) {

            ht-u.v.flags = ~HASH_FLAG_HAS_EMPTY_IND;

        }

    } else if (UNEXPECTED(ht == EG(symbol_table))) {

        num = zend_array_recalc_elements(ht);

    } else {

        num = zend_hash_num_elements(ht);

    }

    return num;

}

IS_REFERENCE:间接 zval 指的就是其真正的值是存储在其他地方的。注意这个 IS_REFERENCE 类型是不同的,间接 zval 是直接指向另外一个 zval 而不是像 zend_reference 结构体一样嵌入 zval。

只有当数组中有 HASH_FLAG_HAS_EMPTY_IND 这个 flag 时(间接zval)才会对数组进行遍历校验,其他情况下都是直接取 数组(hash table) 里面的 nNumOfElements 的值,答案显而易见了,就是O(1)

php如何计算数组的单元个数

//count函数有两个参数:

//0(或COUNT_NORMAL)为默认,不检测多维数组(数组中的数组);

//1(或COUNT_RECURSIVE)为检测多维数组,

$arr=array(

0=array('title' = '新闻1', 'viewnum' = 123, 'content' = '内容1'),

1=array('title' = '新闻2', 'viewnum' = 99, 'content' = '内容2')

);

echo '不统计多维数组:'.count($arr,0); echo '或用sizeof为'.sizeof($arr,0);

echo "br/";

echo '统计多维数组:'.count($arr,1);echo '或用sizeof为'.sizeof($arr,1);