Кто-нибудь знает, как подсчитать появление «фото» в этом массиве:
Array ( [0] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-03-02T07:58:23+0000 ) [1] => stdClass Object ( [type] => photo [id] => 14047818930362 [created_time] => 2012-03-01T14:58:53+0000 ) [2] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-03-01T09:49:40+0000 ) [3] => stdClass Object ( [type] => status [id] => 14047818930362 [created_time] => 2012-03-01T09:36:04+0000 ) [4] => stdClass Object ( [type] => photo [id] => 14047818930362 [created_time] => 2012-02-28T07:03:25+0000 ) [5] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-02-27T09:15:34+0000 ) [6] => stdClass Object ( [type] => photo [id] => 14047818930362 [created_time] => 2012-02-27T07:32:13+0000 ) [7] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-25T09:36:57+0000 ) [8] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-02-23T08:46:43+0000 ) [9] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-22T21:04:30+0000 ) [10] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-21T20:38:27+0000 ) [11] => stdClass Object ( [type] => photo [id] => 1404781893036 [created_time] => 2012-02-21T07:22:44+0000 ) [12] => stdClass Object ( [type] => status [id] => 14047818930362 [created_time] => 2012-02-20T08:32:46+0000 ) [13] => stdClass Object ( [type] => status [id] => 1404781893036 [created_time] => 2012-02-17T15:00:11+0000 ) )
$count = 0; foreach ($array as $item) { if ($item->type === 'photo') { $count++; } }
Чтобы подсчитать совпадение строки в многомерном массиве, вам нужно будет перебирать каждый элемент массива и сопоставлять строку и увеличивать счетчик. Аналогично @Dor предложил
$count = 0; foreach ($array as $item) { if ($item->type === 'photo') { $count++; } }
Если вы хотите добиться того же в одномерном массиве, то это довольно просто. Вы можете использовать функцию массива array_count_values PHP, как описано ниже.
<?php $array = array(1, "test", 1, "php", "test"); print_r(array_count_values($array)); ?>
Вышеприведенный пример выводит:
Array ( [1] => 2 [test] => 2 [php] => 1 )
Попробуйте:
$input = array( /* your data */ ); $count = 0; foreach ( $input as $value ) { if ( $value->type == 'photo' ) { $count++; } }
Я хотел бы признать, что метод Дор Шэмера (IMO) – самый прямой, чистый, читаемый и надежный метод. Я просто хочу предложить несколько альтернатив тем, кто предпочитает использовать функциональное программирование … array_reduce()
для меня второй. Наконец, я хочу точно определить небольшую gotcha для методов, которые используют array_count_values()
– пожалуйста, прочитайте …
Батарея методов: ( демо )
$photo_count=0; // establish default value foreach($array as $objects){ if($objects->type==='photo') ++$photo_count; // pre-increment } echo "foreach result = $photo_count"; echo "array_reduce = ",array_reduce($array,function($carry,$objects){return $carry+($objects->type==='photo'?1:0);},0); echo "array_filter & count = ",sizeof(array_filter($array,function($objects){return $objects->type==='photo';})); echo "array_column & array_filter & count = ",sizeof(array_filter(array_column($array,'type'),function($v){return $v==='photo';})); echo "array_map & array_count_values & array_replace = ",array_replace(['photo'=>0],array_count_values(array_map(function($o) {return $o->type;}, $array)))['photo']; echo "array_map & array_count_values (gives Notice) = ",array_count_values(array_map(function($o) {return $o->type;}, $array))['photo'];
Вход / выход с использованием данных выборки OP (без проблем):
$array=[ (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-03-02T07:58:23+0000'], (object)['type'=>'photo','id'=>14047818930362,'created_time'=>'2012-03-01T14:58:53+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-03-01T09:49:40+0000'], (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-03-01T09:36:04+0000'], (object)['type'=>'photo','id'=>14047818930362,'created_time'=>'2012-02-28T07:03:25+0000'], (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-02-27T09:15:34+0000'], (object)['type'=>'photo','id'=>14047818930362,'created_time'=>'2012-02-27T07:32:13+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-25T09:36:57+0000'], (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-02-23T08:46:43+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-22T21:04:30+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-21T20:38:27+0000'], (object)['type'=>'photo','id'=>1404781893036,'created_time'=>'2012-02-21T07:22:44+0000'], (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-02-20T08:32:46+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-17T15:00:11+0000'] ]; // output: foreach result = 7 array_reduce = 7 array_filter & count = 7 array_column & array_filter & count = 7 array_map & array_count_values & array_replace = 7 array_map & array_count_values = 7
Ввод / вывод с использованием данных без photo
(проблема со вторым методом array_count_values()
):
$array=[ (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-03-01T09:49:40+0000'], (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-03-01T09:36:04+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-25T09:36:57+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-22T21:04:30+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-21T20:38:27+0000'], (object)['type'=>'status','id'=>14047818930362,'created_time'=>'2012-02-20T08:32:46+0000'], (object)['type'=>'status','id'=>1404781893036,'created_time'=>'2012-02-17T15:00:11+0000'] ]; // or if there are no object rows like: $array=[]; // output: foreach result = 0 array_reduce = 0 array_filter & count = 0 array_column & array_filter & count = 0 array_map & array_count_values & array_replace = 0 array_map & array_count_values (gives Notice) = <br /> <b>Notice</b>: Undefined index: photo in <b>[...][...]</b> on line <b>43</b><br />
array_count_values()
не пытается генерировать элементы со счетом 0
.