ホームページ >バックエンド開発 >PHPチュートリアル >PHPソースコード読み込み:count関数

PHPソースコード読み込み:count関数

WBOY
WBOYオリジナル
2016-06-20 12:25:471089ブラウズ

PHP プログラミングでは、配列を走査するときに、ループの終了を決定する条件として最初に配列の長さを計算する必要があることがよくあります。非常に頻繁に使用されるので、count 関数の具体的な実装を検討してみましょう。

github には PHP ソース コードに関するより詳細な注釈があります。興味があれば、見てスターを付けてください。 PHP5.4のソースコードのアノテーション。追加された注釈は、コミット レコードを通じて表示できます。

count

int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )

count 関数は、配列またはオブジェクト内のすべての要素の数をカウントします。

オブジェクトの場合、SPL 拡張機能をインストールすると、Countable インターフェイスを実装することで count 関数を呼び出すことができます。 Countable インターフェイスには、count() 関数の戻り値を返すメソッド Countable::count() が 1 つだけあります。

パラメータの説明

mode

パラメータ モードが COUNT_RECURSIVE (または 1) に設定されている場合、count() はこの配列を再帰的に計算します。多次元配列を計算する場合に特に便利です。

最初のパラメータが配列または Countable インターフェイスを実装するオブジェクトでない場合、count 関数は 1 を返します。

注: count 関数は無限ループを回避するために再帰を検出できますが、無限再帰が発生した場合、または予想より大きな値を取得した場合は E_WARNING プロンプトを返します。

サンプルを実行します

通常のアプリケーション

$arr1 = array(1, 2, 3, 4, 5);$val1 = count($arr1); // 5

多次元配列

$arr2 = array('apple', 'banana', array('cat', 'camel'), 'dog');$val2_1 = count($arr2); // 4$val2_2 = count($arr2, 1); // 6

数値と文字列

$str = "hello world";$int_val = 1;$val3 = count($str); // 1$val4 = count($int_val); // 1

通常のオブジェクト

class User {    private $name;    private $address;}$user = new User();$val5 = count($user); // 1$val6 = count((array) $user); // 2

配列のようなオブジェクト

class User extends ArrayObject {    private $name;    public function __construct() {        $this->name = 'hhq';    }    public function getName() {        return $this->name;    }    public function count() {        return 2;    }}$user2 = new User();$val7 = count($user2); // 2

Countable インターフェイス オブジェクトを実装します

class User implements Countable {    public function count() {        return 3;    }}$user3 = new User();$val8 = count($user3); // 3 

ステップを実行します

switch ステートメントを入力してパラメータの型を検出します

NULL の場合は、直接 0 を返します

は配列です。php_count_recursive を呼び出します。関数マシンは配列要素の数を選択します。

オブジェクトの場合は、まず配列のようなオブジェクトであるかどうかを確認します。そうであれば、配列オブジェクトの数を計算します。

それ以外の場合、オブジェクトが実装している場合 Countable インターフェイスがある場合は、Countable の count メソッドを呼び出します

最後に、整数配列や文字列などの他の型は 1 を返します。

ソース コードの解釈

通常の配列の場合、count 関数は php_count_recursive 関数を呼び出してその関数を実装します。実行手順は次のとおりです。 > 現在のハッシュ バケットが再帰的にアクセスされている場合 数値が 1 より大きい場合、再帰が繰り返されていることを示し、E_WARNING エラーが返されます

それ以外の場合は、現在の配列レベルの配列要素の数を計算します

再帰パラメータ オプションがあります。再帰アクセスを続行します。

パラメータがオブジェクト型の場合、実装は最初にハンドラが定義されているかどうかを判断します。ハンドラーは PHP カーネル内のオブジェクトの構造であり、実際には関数である

count_elements

フィールドが含まれています。オブジェクトが配列のように動作する場合 (一般に 配列のようなオブジェクト として知られています)、 count_elements 関数が実行されます。具体的な実装では、クラスが PHP の ArrayObject を継承し、クラス内に count 関数を実装します。その具体的な呼び出しは、クラスが count 関数を実装していない場合は 0 を返し、それ以外の場合はオブジェクトの count 関数の戻り値を返します。が返されます。 その他のデータ型の場合 1. 文字列

2. 数値

3. オブジェクトブランチの if 判定が両方とも false の場合、つまり ArrayObject が継承されない場合また、Countable インターフェイスは実装されていません。

これらの型はすべて 1 を返します。

オブジェクトの属性の数を計算する必要がある場合は、まずオブジェクトを配列に変換してから、count 関数を呼び出すことができることに注意してください。例: $count_value = count((array) $user);

概要

count 関数のソース コードを読んでいるときに、いずれかの手順で行き詰まってしまいました。 (Z_OBJ_HT_P(array)- >count_elements) ステップ。このブランチに入るデモをまだ書くことができず、インターネットで多くの情報を検索しても無駄だったので、TIPI の reeze に助けを求め、最終的には私が欲しかった答え。分からなかったら聞いてください(笑)。

文体が限られ知識も浅いオリジナル記事です 記事内に間違いがあればご指摘ください。

ヒントは、より良い記事を書くのに役立ちます、ありがとう!

著者に報酬を与えます

報酬は、より良い記事を書くのに役立ちます、ありがとう!

支払い方法を選択してください

著者について: hoohack

働いている人ハードルーキー個人ホームページ · 私の記事 · 15 ·

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。