php计数函数count,php 函数

发布时间:2022-11-30

本文目录一览:

  1. php中count()函数的作用?
  2. php中统计数组的长度是那个函数?
  3. php count函数使用问题
  4. php中计算二维数组中某一元素之和的函数是那个啊?谢谢……
  5. PHP的count(数组)和strlen(字符串)的内部实现。
  6. php如何计算数组的单元个数

php中count()函数的作用?

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

计算数组元素个数示例:

$arr = array("baidu", "google", "soso");
echo count($arr);
//结果:3

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

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函数使用问题

如果你单纯是要计算查询出的行数,用 mysql_num_rows($R1); 就可以了。 如果是别的问题,可以加我百度HI,一起讨论一下。 其实你 print_r($select); 你就会发现你的数组是6个数据,因为 mysql_fetch_array() 的语法是这样的:

array mysql_fetch_array(resource result [, int result_type])

也就是说第二个参数可以取三个值 MYSQL_NUMMYSQL_ASSOCMYSQL_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中声明数组的方式主要有两种:一是应用 array() 函数声明数组,一是直接为数组元素赋值。

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

参数 mixed 的语法为 key=value。 如:

$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. 直接为数组元素赋值

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

$array[1] = "I";
$array[2] = "love";
$array[3] = "PHP";
print_r($array); // 输出所创建数组的结构

三、数组的类型

PHP支持两种数组:索引数组(indexed array)和联合数组(associative array),前者使用数字作为键,后者使用字符串作为键。

四、输出数组

在PHP中对数组元素输出,可以通过 echoprint 语句来实现,但这只能对数组中某一元素进行输出;要将数组结构输出则要使用 print_r() 函数,其语法:print_r(mixed expression),参数 expression 为普通的整形、字符型或实型变量则输出该变量本身,如果该参数为数组,则按一定键值和元素的顺序显示出该数组中的所有元素。

五、数组的构造

一维数组:

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

类型说明符 数组名[常量表达式];

二维数组:

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

$str = array(
    "网络编程语言" => array("PHP", "JSP", "ASP"),
    "体育项目" => array("m" => "足球", "n" => "篮球")
);
print_r($str);

六、遍历数组

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

  1. 使用 foreach 结构遍历数组;
  2. 使用 list() 函数遍历数组,list() 函数仅能用于数字索引的数组,且数字索引从0开始。 例:综合使用 list()each() 认证用户登录:
// 输出用户登录信息
while (list($name, $value) = each($_POST)) {
    if ($name != "submit") {
        echo "$name=$value<br>";
    }
}

七、统计数组元素个数

在PHP中,使用 count() 函数对数组中的元素个数进行统计,语法为:int count(mixed array[, int mode]),其中参数 array 为必要参数,mode 为可选参数,若选中 COUNT_RECURSIVE(或1),本函数将递归地对数组数组。 如:

$array = array(
    "php" => array("PHP函数参考大全", "PHP程序开发范例宝典", "PHP数据库系统开发完全手册"),
    "asp" => array("ASP经验技巧宝典")
); // 声明一个二维数组
echo count($array, COUNT_RECURSIVE); // 递归统计数组元素的个数,运行结果为6

八、数组排序

  1. 使用 sort()rsort() 分别对数组进行升序和降序。 如:
$array = array(5, 26, 37, 18, 9, 42, 88, 66);
$array1 = sort($array);
for ($i = 0; $i < count($array); $i++) {
    echo $array[$i] . " ";
}
echo "<br>";
$array1 = rsort($array);
for ($i = 0; $i < count($array); $i++) {
    echo $array[$i] . " ";
}

运行结果:

5 9 18 26 37 42 66 88 
88 66 42 37 26 18 9 5 
  1. 使用 ksort()asort() 对关联数组排序 如果使用了相关数组,在排序后还要保持关键字和值的排序一致,这时就需要使用 ksort()asort() 函数。 如:
$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;
}

只有当数组中有 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);