2011-03-02 33 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); 
相關問題