Rumah pembangunan bahagian belakang tutorial php PHP源代码数组统计count分析_php技巧

PHP源代码数组统计count分析_php技巧

May 17, 2016 am 09:16 AM
count Statistik tatasusunan

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;
}
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbezaan antara counta dan count Perbezaan antara counta dan count Nov 20, 2023 am 10:01 AM

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.

Cara mengira bilangan kejadian setiap nilai dalam tatasusunan menggunakan fungsi array_count_values ​​dalam PHP Cara mengira bilangan kejadian setiap nilai dalam tatasusunan menggunakan fungsi array_count_values ​​dalam PHP Jun 26, 2023 pm 02:12 PM

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

Ringkasan perbezaan penggunaan fungsi MySQL Count Ringkasan perbezaan penggunaan fungsi MySQL Count Nov 29, 2022 pm 04:47 PM

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.

Apakah kegunaan fungsi kira dalam php Apakah kegunaan fungsi kira dalam php Sep 09, 2021 pm 05:08 PM

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 Pengenalan fungsi PHP—array_count_values(): Kira bilangan kejadian setiap elemen dalam tatasusunan Jul 25, 2023 pm 07:18 PM

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

Bagaimana untuk menyelesaikan masalah mengira berbilang lajur yang berbeza dalam mysql Bagaimana untuk menyelesaikan masalah mengira berbilang lajur yang berbeza dalam mysql Jun 03, 2023 am 10:49 AM

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.

Belajar menggunakan fungsi PHP count() untuk mengira bilangan elemen tatasusunan Belajar menggunakan fungsi PHP count() untuk mengira bilangan elemen tatasusunan Jun 27, 2023 am 10:37 AM

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

Bagaimanakah java Mengira elemen dalam aliran? Bagaimanakah java Mengira elemen dalam aliran? May 11, 2023 pm 04:07 PM

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)

See all articles