Maison développement back-end tutoriel php PHP源代码数组统计count分析_php技巧

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

May 17, 2016 am 09:16 AM
count 数组统计

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;
}
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La différence entre counta et count La différence entre counta et count Nov 20, 2023 am 10:01 AM

La fonction Count est utilisée pour compter le nombre de nombres dans une plage spécifiée. Elle ignore le texte, les valeurs logiques et les valeurs nulles, mais compte les cellules vides. La fonction Count ne compte que le nombre de cellules contenant des nombres réels. La fonction CountA est utilisée pour compter le nombre de cellules non vides dans une plage spécifiée. Il compte non seulement les cellules contenant des nombres réels, mais également le nombre de cellules non vides contenant du texte, des valeurs logiques et des formules.

Comment compter le nombre d'occurrences de chaque valeur dans un tableau à l'aide de la fonction array_count_values ​​​​​​en PHP Comment compter le nombre d'occurrences de chaque valeur dans un tableau à l'aide de la fonction array_count_values ​​​​​​en PHP Jun 26, 2023 pm 02:12 PM

En PHP, nous devons souvent effectuer diverses opérations sur des tableaux. Compter le nombre d’occurrences de chaque valeur dans un tableau est l’un des besoins courants. PHP fournit une fonction simple et efficace - array_count_values, qui peut facilement accomplir cette tâche. La syntaxe de la fonction array_count_values ​​​​est la suivante : array_count_values(array$array) Cette fonction reçoit un paramètre de tableau et renvoie un nouveau tableau contenant l'original

Résumé des différences d'utilisation de la fonction MySQL Count Résumé des différences d'utilisation de la fonction MySQL Count Nov 29, 2022 pm 04:47 PM

Cet article vous présente les différences d'utilisation de la fonction Count de MySQL. Le besoin de données statistiques est très facile à rencontrer dans notre développement quotidien. MySQL prend également en charge une variété de fonctions de calcul. Examinons ensuite les différences entre elles. et s'ils ont des pièges.

Quelle est l'utilisation de la fonction count en php Quelle est l'utilisation de la fonction count en php Sep 09, 2021 pm 05:08 PM

L'utilisation de la fonction count en PHP est : [count(array,mode);], où le paramètre array spécifie le tableau à compter et le paramètre mode spécifie le mode de la fonction.

Introduction à la fonction PHP — array_count_values() : compte le nombre d'occurrences de chaque élément du tableau Introduction à la fonction PHP — array_count_values() : compte le nombre d'occurrences de chaque élément du tableau Jul 25, 2023 pm 07:18 PM

Introduction à la fonction PHP — array_count_values() : Comptez le nombre d'occurrences de chaque élément dans un tableau. Dans le développement de PHP, nous rencontrons souvent des situations où nous devons compter les éléments d'un tableau. PHP fournit quelques fonctions pratiques pour nous aider à atteindre cet objectif, dont la fonction array_count_values(). La fonction array_count_values() peut compter les occurrences de chaque élément du tableau et renvoyer un tableau associatif, où

Comment résoudre le problème du nombre de colonnes distinctes dans MySQL Comment résoudre le problème du nombre de colonnes distinctes dans MySQL Jun 03, 2023 am 10:49 AM

La base de données de test reproduite est la suivante : CREATETABLE`test_distinct`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`varchar(50)CHARACTERSETutf8DEFAULTNULL,`b`varchar(50)CHARACTERSETutf8DEFAULTNULL,PRIMARYKEY(`id`))ENGINE= InnoDBAUTO_INCREMENT =1DEFAULTCHARSET=latin1;Les données de test dans le tableau sont les suivantes. Nous devons maintenant compter les colonnes dédupliquées de ces trois colonnes.

Apprenez à utiliser la fonction PHP count() pour compter le nombre d'éléments d'un tableau Apprenez à utiliser la fonction PHP count() pour compter le nombre d'éléments d'un tableau Jun 27, 2023 am 10:37 AM

PHP est un langage de programmation côté serveur très populaire doté de puissantes capacités de développement, notamment dans les opérations sur tableaux. Les tableaux en PHP sont largement utilisés pour stocker et gérer plusieurs éléments de données. Lorsque vous travaillez sur un tableau, il est souvent nécessaire de compter le nombre d'éléments dans le tableau. Cela peut être réalisé en utilisant la fonction count() en PHP. La fonction count() est la fonction intégrée de PHP pour compter le nombre d'éléments d'un tableau. Lorsque vous utilisez cette fonction, il vous suffit de passer le tableau en paramètre de la fonction

Comment Java Count compte-t-il les éléments dans un flux ? Comment Java Count compte-t-il les éléments dans un flux ? May 11, 2023 pm 04:07 PM

Remarque 1. Count est une opération de terminal qui peut compter le nombre total d'éléments dans le flux. La valeur de retour est de type long. 2. count() renvoie le nombre d'éléments dans le flux. Il s'agit d'un cas particulier d'induction (une opération d'induction prend une séquence d'éléments d'entrée et les combine en un résultat récapitulatif en appliquant de manière répétée l'opération de combinaison). Il s’agit d’une opération terminale et peut avoir des conséquences et des effets secondaires. Après l'exécution d'une opération sur le terminal, la canalisation est considérée comme consommée et ne peut pas être réutilisée. Exemple // Vérifiez s'il y a une chaîne dans la liste commençant par a et correspond à la première, c'est-à-dire return truebooleananyStartsWithA=stringCollection.stream().anyMatch((s

See all articles