PHPソースコード配列統計カウント分析
zend によって PHP に与えられるすべての変数は構造的な方法で保存され、文字列の保存と配列の保存はハッシュ テーブルの形式で保存されます (ハッシュによって保存されたアドレスが効果的に競合を軽減できることは誰もが知っています)。 -hash ハッシュ テーブルの概念はご存知でしょう)、PHP の構造は次のとおりです:
コードをコピー コードは次のとおりです:
//ファイル 1: zend/zend.h
/*
* zval
*/
typedef struct _zval_struct zval
...
typedef Union _zvalue_value; {
long lval; /* long 値 */
double 値 */
struct {
int len; str; 🎜>HashTable *ht; /* ハッシュテーブル値 */
zend_object_value
} zvalue_value;
struct _zval_struct {
/* 変数情報 */
zvalue_value / * value * /
zend_uint refcount__gc;
zend_uchar type; /* アクティブなタイプ */
zend_uchar is_ref__gc;
} // ハッシュテーブルの構造は次のとおりです
// ファイル 2: zend/zend_hash.h
typedef struct _hashtable {
uint nTableSize;
uint nTableMask;
ulong nNextFreeElement; /*要素のトラバーサルに使用されます */
Bucket *pListTail;
zend_bool pDestructor; 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
#定義 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 )
配列のカウント操作に関しては、実際には 2 つの結果があります。2 番目のパラメーター モードは、カウント API「http://www.php.net」にも記載されています。 /manual/ja /function.count.php》、このモードパラメータは再カウントが必要かどうかを示し、再カウントは配列を 1 回走査し、デフォルトでは効率は O(N)[N: length] です。 、再カウントは必要ありません。その場合、ハッシュテーブル内の nNumOfElements がこの時点で直接出力され、この時点の効率も O(1) 倍になります。カウント コードは次のとおりです:
コードをコピー
コードは次のとおりです:
//ファイル 4: ext/standard/array.c
PHP_FUNCTION(count)
{
long モード = 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; (配列, モード 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, "再帰が検出されました");
return
}
//長さを取得します。 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(配列), &pos)
) {
Z_ARRVAL_P(配列) ->nApplyCount
cnt = php_count_recursive(*element, COUNT_RECURSIVE TSRMLS_CC); P(配列) ->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;

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、
