我想承认 Dor Shemer 的方法是(IMO)最直接、干净、可读和可靠的方法。我只想为那些喜欢使用函数式编程的人提供一些替代方案……array_reduce()
对我来说紧随其后。最后,我想指出一个使用方法的小问题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
计数的元素。