2009-08-22 3 views
81

У меня есть объект stdClass, созданный из json_decode, который не вернет правильное число при запуске функции count ($ obj). Объект имеет 30 свойств, но возврат функции count() равен 1.PHP: Count объект stdClass

Любые идеи?

Ниже приведен пример одного из объектов. (Я запрашиваю ежедневную информацию о тенденциях из Twitter). Если этот объект имел более одного свойства, количество ($ 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: 05', являющееся массивом с 20 элементами, поэтому count ($ trend) будет по праву возвращаться 1. –

+1

[Стивен указал] (http: /переполнение стека.com/questions/1314745/php-count-an-stdclass-object/1314754 # 1314754), Object имеет тип stdClass, который не реализует интерфейс Countable, поэтому count () всегда будет возвращать 1. –

+0

Хопель, ты совершенно прав. Если я передам объект массиву, он вернет правильный номер! Отлично. – hellopat

ответ

168

Проблема заключается в том, что счетчик предназначен для подсчета индексов в массиве, а не свойства на объект, (если это настраиваемый объект, который реализует интерфейс Countable). Попробуйте использовать объект, как показано ниже, как массив и посмотреть, помогает ли это.

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

Просто отливка объекта как массив не всегда будет работать, но быть простой StdClass объекта он должен получить работу здесь.

+8

Будьте уверены, что частные свойства появятся в результирующем массиве, что действительно неожиданно. –

+9

Хотя этот метод работает, я бы не использовал его для реализации, потому что будущие версии PHP могут привести к разрыву этого кода, я предпочитаю ответ Алана Строма. – ars265

9

Объект не имеет 30 объектов. Он имеет один, который представляет собой массив, содержащий 30 элементов. Вам нужно количество элементов в этом массиве.

+1

Выбирая данные немного больше, может быть лучше использовать параметр $ assoc с json_encode, который преобразует его в массив. Это свойство, которое вы получаете, называется из метки времени, которая будет иметь правильную боль для регулярного доступа. В качестве массива вы можете просто подсчитать ($ trend [0]); –

+0

Я, вероятно, должен был дать лучший пример. Объект stdClass имеет больше, чем тот, который я дал в примере. Он имеет 32, каждый из которых содержит массив из 20 элементов. – hellopat

4

Там нет ничего плохого в счете() здесь, «тенденция» является единственным ключом, который подсчитывается в этом случае, вы можете попробовать сделать:

count($obj->trends); 

Или:

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

Или, может быть, даже делать:

count($obj, COUNT_RECURSIVE); 
85

функция счетчик предназначен для использования на

  1. Массивы
  2. Объекты, которые получены из классов, которые реализуют интерфейс счетное

StdClass является ни один из них. Проще/быстрый способ сделать то, что вы после

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

Это использует get_object_vars функцию PHP, которая будет возвращать свойства объекта в виде массива. Затем вы можете использовать этот массив с функцией подсчета PHP.

+0

Прежде чем PHP 7, 'get_object_vars()' на 'stdClass', который возник из-за приведения массива к объекту, даст пустой массив. С другой стороны, использование экземпляра 'stdClass' для массива работает повсеместно. – XedinUnknown

-2

count() функция работает с массивом. Но если вы хотите подсчитать длину объекта, вы можете использовать этот метод.

$total = $obj->length; 
0

Просто используйте этот

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

переменная $i является количество ключей.

Смежные вопросы