PHP : stdClass 객체 계산


121

count ($ obj) 함수를 실행할 때 올바른 숫자를 반환하지 않는 json_decode에서 만든 stdClass 객체가 있습니다. 객체에는 30 개의 속성이 있지만 count () 함수의 반환 값은 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
당신의 예를 명확히 해주시겠습니까? 게시 한대로 2009-08-21 11:0520 개의 항목이있는 배열 인 하나의 속성 이 있으므로 count ($ trends)는 정당하게 1을 반환합니다.
Henrik Opel

1
마찬가지로 스티븐 지적 , 개체가 가산 근로 인터페이스를 구현하지 않는 타입 stdClass,이다, 따라서 계산 (<stdClass 객체>)는 항상 1 반환합니다
헨릭 오펠

Hopel, 당신이 정확히 맞습니다. 객체를 배열로 캐스팅하면 올바른 숫자가 반환됩니다! 우수한.
hellopat 2009-08-22

대답을 받아들이고 싶을 수도 있습니다. 특히 첫 번째 답변이 당신에게 효과가 있다는 의견에 당신이 쓴 geiven.
Andresch Serj 2013

답변:


253

문제는 count가 개체의 속성이 아니라 배열의 인덱스를 계산하기위한 것입니다 (Countable 인터페이스를 구현하는 사용자 지정 개체가 아닌 경우). 아래와 같이 객체를 배열로 캐스팅하고 도움이되는지 확인하십시오.

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

단순히 객체를 배열로 캐스팅하는 것이 항상 작동하는 것은 아니지만 간단한 stdClass 객체이므로 여기서 작업을 수행해야합니다.


9
개인 속성이 결과 배열에 나타날 것이라는 점에 유의하십시오.
Hugo Mota

14
이 방법은 작동하지만 이후 버전의 PHP로 인해이 코드가 손상 될 수 있으므로 구현에 사용하지 않을 것입니다. Alan Strom의 대답을 훨씬 선호합니다.
ars265 jul.

109

카운트 기능은

  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. Daumann

8

개체에 30 개의 속성이 없습니다. 하나는 30 개의 요소가있는 배열입니다. 해당 배열의 요소 수가 필요합니다.


1
데이터를 조금 더 살펴보면 $ assoc 매개 변수를 json_encode와 함께 사용하여 배열로 변환하는 것이 더 나을 수 있습니다. 당신이 얻는 그 속성은 정기적으로 액세스하는 데 적절한 고통이 될 타임 스탬프에서 명명되었습니다. 배열로 그냥 count ($ trends [0]);
Rob Drimmie

나는 아마도 더 나은 예를 들었어야했다. stdClass 객체에는 예제에서 제공 한 것 이상이 있습니다. 각각 20 개의 요소가있는 배열을 포함하는 32 개가 있습니다.
hellopat 2009-08-22

5

여기에서는 count ()에 문제가 없습니다. "trends"가이 경우에 계산되는 유일한 키입니다. 다음을 시도해 볼 수 있습니다.

count($obj->trends);

또는:

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

또는 다음을 수행 할 수도 있습니다.

count($obj, COUNT_RECURSIVE);

1

그냥 사용하세요

$i=0;
foreach ($object as $key =>$value)
{
$i++;
}

변수 $i는 키의 수입니다.


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.