PHP源代码数组统计count分析_php技巧
zend给php的所有变量都用结构的方式去保存,而字符串的保存和数组的保存也是不同的,数组采用的是hash表的方式去保存(大家知道hash保存的地址有效的减少冲突-hash散列表的概念你懂的),而在php中的结构体上表现如下:
//文件1:zend/zend.h
/*
* zval
*/
typedef struct _zval_struct zval;
...
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;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
//hash表的结构如下
//文件2:zend/zend_hash.h
typedef struct _hashtable {
uint nTableSize;
uint nTableMask;
uint nNumOfElements;
ulong nNextFreeElement;
Bucket *pInternalPointer; /* Used for element traversal */
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
dtor_func_t pDestructor;
zend_bool persistent;
unsigned char nApplyCount;
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
}
HashTable;
一般的变量(字符串)在使用strlen获取长度的时候,其实获取的就是zvalue_value.str这个结构中的len属性,效率上O(1)次,特别说明的一点是:strlen在php中并没有核心的实现,而是在使用了zend中的宏定义来获取:
//文件3:zend/zend_operators.php
#define Z_STRLEN(zval) (zval).value.str.len
...
#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p)
...
#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp)
而对于数组的count操作,其实有两种结果,在count 的api中也提到了第二个参数mode《http://www.php.net/manual/en/function.count.php》,这个mode参数指明了,是否需要重新统计,而它的重新统计将会遍历一次数组,效率上是O(N)[N:长度],默认情况下是不重新统计,那这个时候将会直接输出hashtable中的nNumOfElements,此时的效率也是O(1)次:count代码如下:
//文件4:ext/standard/array.c
PHP_FUNCTION(count)
{
zval *array;
long mode = COUNT_NORMAL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) {
return;
}
switch (Z_TYPE_P(array)) {
case IS_NULL:
RETURN_LONG(0);
break;
case IS_ARRAY:
RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));
break;
.....
//php_count_recursive的实现
static int php_count_recursive(zval *array, long mode TSRMLS_DC) /* {{{ */
{
long cnt = 0;
zval **element;
if (Z_TYPE_P(array) == IS_ARRAY) {
//错误处理
if (Z_ARRVAL_P(array)->nApplyCount > 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected");
return 0;
}
//通过zend_hash_num_elements直接获得长度
cnt = zend_hash_num_elements(Z_ARRVAL_P(array));
//如果指定了需要重新统计,则会进入一次循环统计
if (mode == COUNT_RECURSIVE) {
HashPosition pos;
for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(array), &pos);
zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **) &element, &pos) == SUCCESS;
zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos)
) {
Z_ARRVAL_P(array)->nApplyCount++;
cnt += php_count_recursive(*element, COUNT_RECURSIVE TSRMLS_CC);
Z_ARRVAL_P(array)->nApplyCount--;
}
}
}
return cnt;
}
//文件5:zend/zend_hash.c
//zend_hash_num_elements的实现
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Fungsi Count digunakan untuk mengira bilangan nombor dalam julat yang ditentukan. Ia mengabaikan teks, nilai logik dan nilai nol, tetapi mengira sel kosong Fungsi Count hanya mengira bilangan sel yang mengandungi nombor sebenar. Fungsi CountA digunakan untuk mengira bilangan sel yang tidak kosong dalam julat tertentu. Ia bukan sahaja mengira sel yang mengandungi nombor sebenar, tetapi juga mengira bilangan sel bukan kosong yang mengandungi teks, nilai logik dan formula.

Dalam PHP, kita sering perlu melakukan pelbagai operasi pada tatasusunan Mengira bilangan kejadian setiap nilai dalam tatasusunan adalah salah satu keperluan biasa. PHP menyediakan fungsi yang mudah dan cekap - array_count_values, yang boleh menyelesaikan tugas ini dengan mudah. Sintaks fungsi array_count_values adalah seperti berikut: array_count_values(array$array) Fungsi ini menerima parameter tatasusunan dan mengembalikan tatasusunan baharu yang mengandungi nilai asal

Artikel ini memperkenalkan kepada anda perbezaan penggunaan fungsi Kiraan MySQL Keperluan untuk data statistik sangat mudah ditemui dalam pembangunan harian kami juga menyokong pelbagai fungsi pengiraan. dan sama ada mereka mempunyai beberapa perangkap.

Penggunaan fungsi kiraan dalam PHP ialah: [count(array,mode);], di mana tatasusunan parameter menentukan tatasusunan untuk dikira, dan mod parameter menentukan mod fungsi.

Pengenalan fungsi PHP—array_count_values(): Kira bilangan kejadian setiap elemen dalam tatasusunan Dalam pembangunan PHP, kita sering menghadapi situasi di mana kita perlu mengira elemen dalam tatasusunan. PHP menyediakan beberapa fungsi yang mudah untuk membantu kami mencapai matlamat ini, salah satunya ialah fungsi array_count_values(). Fungsi array_count_values() boleh mengira kejadian setiap elemen dalam tatasusunan dan mengembalikan tatasusunan bersekutu, di mana

Pangkalan data ujian yang dihasilkan semula adalah seperti berikut: CREATETABLE`test_distinct`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`varchar(50)CHARACTERSETutf8DEFAULTNULL,`b`varchar(50)CHARACTERSETutf8DEFAULTNULL(`id`PRIMARYONCREMENT)Y =1DEFAULTCHARSET=latin1;Data ujian dalam jadual adalah seperti berikut. Sekarang kita perlu mengira lajur pendua bagi tiga lajur ini.

PHP ialah bahasa pengaturcaraan sebelah pelayan yang sangat popular dengan keupayaan pembangunan yang berkuasa, terutamanya dalam operasi tatasusunan. Tatasusunan dalam PHP digunakan secara meluas untuk menyimpan dan mengurus berbilang item data. Apabila beroperasi pada tatasusunan, selalunya perlu mengira bilangan elemen dalam tatasusunan Ini boleh dicapai dengan menggunakan fungsi count() dalam PHP. Fungsi count() ialah fungsi terbina dalam PHP untuk mengira bilangan elemen tatasusunan. Apabila menggunakan fungsi ini, anda hanya perlu menghantar tatasusunan sebagai parameter fungsi

Nota 1. Kira ialah operasi terminal yang boleh mengira jumlah bilangan elemen dalam aliran Nilai pulangan adalah jenis panjang. 2. count() mengembalikan kiraan elemen dalam strim. Ini adalah kes aruhan khas (operasi aruhan mengambil urutan elemen input dan menggabungkannya menjadi hasil ringkasan dengan berulang kali menggunakan operasi gabungan). Ini adalah operasi terminal dan mungkin mempunyai akibat dan kesan sampingan. Selepas operasi terminal dilakukan, paip dianggap telah digunakan dan tidak boleh digunakan semula. Contoh // Sahkan sama ada terdapat rentetan dalam senarai bermula dengan a dan padankan yang pertama, iaitu return truebooleananyStartsWithA=stringCollection.stream().anyMatch((s)
