我正在使用包含多个“时间段”对象的数组$ timeslotlist。每个时隙都有多个值,其中一个是“状态”。我无法弄清楚如何计算具有特定状态的时隙数量。
我想做类似于count_array_values($ timeslotlist)的事情,并以一个包含所有可能的键及其出现次数的数组结束,但是我遇到了问题,因为数组中充满了对象。
我离开了为我正在寻找的每个值创建新数组,并使用时隙迭代数组并将具有我正在寻找的值的数据添加到新数组中:
$complete = array();
$incomplete = array();
foreach ($timeslotlist->timeslot as $timeslot) {
if ($timeslot->status == 'complete') {
$complete[]=$timeslot;
}
elseif ($timeslot->status == 'incomplete') {
$incomplete[] = $timeslot;
}
}
$incomplete_count = count($incomplete);
$complete_count = count($complete);
有没有更快/更简单的方法来处理数组中的对象?
感谢您的帮助!
答案 0 :(得分:4)
你可以使用array_filter并传入一个匿名函数来获取你想要的值。
$complete = array_filter($timeslotlist, function($slot) {
return $slot->status == 'complete';
});
如果您不想使用array_filter并且不希望在foreach中为每个状态添加新条件,只需将其转换为函数:
function timeslot_filer($list, $status)
{
$result = array();
foreach($list as $slot)
if($slot->status == $status)
$result[] = $slot;
return $result;
}
然后,只需执行
即可获取具有特定状态的所有广告位$complete = timeslot_filter($timeslotlist, 'complete');
然后只需count($complete)
即可获得计数。
这是你要找的吗?如果没有,请告诉我。
答案 1 :(得分:0)
在PHP核心中没有专门的功能来做这样的事情。但是,您可以使用array_walk()
,array_reduce()
或array_filter()
做一些魔术。但是,我怀疑这会给你带来什么好处,既不是更好的代码,也不是速度提升。我宁愿将您展示的代码封装到一个漂亮的小对象中,只计算而不是创建状态数组。
答案 2 :(得分:0)
这比我想象的要复杂吗?这似乎只是一个普通的数组应该很简单:
$statuses = array();
foreach ($timeslotlist->timeslot as $timeslot) {
$status = $timeslot->status;
//This block is just to avoid a notice; not mandatory.
if (!isset($statuses[$status])) {
$statuses[$status] = 0;
}
$statuses[$status]++;
}
print_r($statuses);