PHP:stdClassオブジェクトを数える


121

count($ obj)関数を実行したときに正しい数を返さないjson_decodeから作成されたstdClassオブジェクトがあります。オブジェクトには30個のプロパティがありますが、count()関数の戻り値は1とされます。

何か案は?

以下は、オブジェクトの1つの例です。(ツイッターから毎日のトレンド情報をリクエストしています)。このオブジェクトに複数のプロパティがある場合、count($ obj)は1になります。

[trends] => stdClass Object
    (
        [2009-08-21 11:05] => Array
            (
                [0] => stdClass Object
                    (
                        [query] => "Follow Friday"
                        [name] => Follow Friday
                    )

                [1] => stdClass Object
                    (
                        [query] => "Inglourious Basterds" OR "Inglorious Basterds"
                        [name] => Inglourious Basterds
                    )

                [2] => stdClass Object
                    (
                        [query] => Inglourious
                        [name] => Inglourious
                    )

                [3] => stdClass Object
                    (
                        [query] => #songsincode
                        [name] => #songsincode
                    )

                [4] => stdClass Object
                    (
                        [query] => #shoutout
                        [name] => #shoutout
                    )

                [5] => stdClass Object
                    (
                        [query] => "District 9"
                        [name] => District 9
                    )

                [6] => stdClass Object
                    (
                        [query] => #howmanypeople
                        [name] => #howmanypeople
                    )

                [7] => stdClass Object
                    (
                        [query] => Ashes OR #ashes
                        [name] => Ashes
                    )

                [8] => stdClass Object
                    (
                        [query] => #youtubefail
                        [name] => #youtubefail
                    )

                [9] => stdClass Object
                    (
                        [query] => TGIF
                        [name] => TGIF
                    )

                [10] => stdClass Object
                    (
                        [query] => #wish09
                        [name] => #wish09
                    )

                [11] => stdClass Object
                    (
                        [query] => #watch
                        [name] => #watch
                    )

                [12] => stdClass Object
                    (
                        [query] => Avatar
                        [name] => Avatar
                    )

                [13] => stdClass Object
                    (
                        [query] => Ramadhan
                        [name] => Ramadhan
                    )

                [14] => stdClass Object
                    (
                        [query] => Goodnight
                        [name] => Goodnight
                    )

                [15] => stdClass Object
                    (
                        [query] => iPhone
                        [name] => iPhone
                    )

                [16] => stdClass Object
                    (
                        [query] => #iranelection
                        [name] => #iranelection
                    )

                [17] => stdClass Object
                    (
                        [query] => Apple
                        [name] => Apple
                    )

                [18] => stdClass Object
                    (
                        [query] => "Usain Bolt"
                        [name] => Usain Bolt
                    )

                [19] => stdClass Object
                    (
                        [query] => H1N1
                        [name] => H1N1
                    )

            )
     )

3
あなたの例を明確にしてもらえますか?あなたが投稿したように、それは1つのプロパティ2009-08-21 11:05、20エントリの配列であるため、count($ trends)は当然1を返します
Henrik Opel

1
以下のようスティーブンは指摘し、オブジェクトはCountableインターフェイスを実装していないタイプはstdClassのものである。したがって、カウント(<はstdClassオブジェクト>)は常に1を返します
ヘンリックオペル

ホペル、その通りです。オブジェクトを配列にキャストすると、正しい数が返されます!優れた。
hellopat 09

あなたは答えを受け入れたいかもしれません。特にあなたが最初に与えられた答えがあなたのために働くというコメントであなたが書いたことを思い起こしてください。
Andresch Serj 2013

回答:


252

問題は、countがオブジェクトのプロパティではなく、配列内のインデックスをカウントすることを目的としていることです(Countableインターフェイスを実装するカスタムオブジェクトでない限り)。以下のようにオブジェクトを配列としてキャストし、それが役立つかどうかを確認してください。

$total = count((array)$obj);

オブジェクトを配列としてキャストするだけでは常に機能するわけではありませんが、単純なstdClassオブジェクトであるため、ここでジョブを実行できます。


9
結果の配列にプライベートプロパティが表示されることに注意してください。これは本当に予期しないことです。
Hugo Mota 2012

14
この方法は機能しますが、PHPの将来のバージョンではこのコードが機能しなくなる可能性があるため、実装には使用しません。
ars265 2013

109

count関数は、

  1. 配列
  2. 可算インターフェイスを実装するクラスから派生したオブジェクト

stdClassはこれらのどちらでもありません。あなたが求めているものを達成するためのより簡単/最も速い方法は

$count = count(get_object_vars($some_std_class_object));

これはPHPのget_object_vars関数を使用し、オブジェクトのプロパティを配列として返します。その後、この配列をPHPのcount関数で使用できます。


1
PHP 7の前に、get_object_vars()上のstdClass空の配列が得られますオブジェクトに配列をキャストに起因しています。stdClass一方、インスタンスを配列にキャストすると、どこでも機能します。
XedinUnknown

PHP 5.6.30で動作します
R.

8

オブジェクトには30個のプロパティがありません。これには、30の要素を持つ配列があります。その配列の要素数が必要です。


1
データをもう少し突っ込んでみると、json_encodeで$ assoc paramを使用して配列に変換する方がよい場合があります。取得しているプロパティは、タイムスタンプから名前が付けられます。これは、定期的にアクセスするのが非常に面倒です。配列として、count($ trends [0]);
Rob Drimmie、2009

おそらくもっと良い例を挙げるべきだったでしょう。stdClassオブジェクトには、例で示したものだけではありません。32あり、それぞれに20要素の配列が含まれています。
hellopat 09

5

count()には何の問題もありません。この場合、「トレンド」がカウントされる唯一のキーです。次のように試すことができます。

count($obj->trends);

または:

count($obj->trends['2009-08-21 11:05']);

または多分さらに:

count($obj, COUNT_RECURSIVE);


0

通常のアリーアまたはオブジェクトを数える

count($object_or_array); 

多次元のアリーアまたはオブジェクトを数える

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default

-4

count()関数は配列で動作します。ただし、オブジェクトの長さを数えたい場合は、このメソッドを使用できます。

$total = $obj->length;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.