2011-03-02 84 views
1

我正在使用包含多个“时隙”对象的数组$ timeslotlist。每个时隙有多个值,其中之一是“状态”。我无法弄清楚如何计算具有特定状态的时隙数量。如何计算具有特定值的数组中的对象(PHP)

我想做一些类似于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

您是否需要'$ incomplete'和'$ complete'数组或者他们的计数? – BoltClock 2011-03-02 08:11:56

+0

因为如果没有,你可以只做$ incomplete_count ++我猜...否则我认为没有更简单的方法来运行一个对象来获取对象的变量...有array_walk可以准备一个小函数但我认为你不能将它应用于对象。 – Tobias 2011-03-02 08:16:43

+0

只需查找数组的个数。我不需要完整的阵列。是的,这是真的,这将使我无法制作数组并对它们进行计数。 – tnichols 2011-03-02 08:19:24

回答

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)的问题来计数。

这是你在找什么?如果没有,请让我知道。

+0

太好了 - 感谢您的帮助,这看起来应该可以工作! – tnichols 2011-03-02 09:01:20

0

在PHP核心中没有专门的功能来做这样的事情。不过,你可以用array_walk()array_reduce()array_filter()做一些魔术。但是,我怀疑这会给你带来什么,无论是更好的代码还是速度的提升。我宁愿将你展示的代码封装到一个漂亮的小对象中,而只是计数而不是创建状态数组。

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); 
相关问题