2011-03-02 12 views
1

여러 개의 "timeslot"객체를 포함하는 배열 $ 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

+0

만약 당신이 그냥 $ incomplete_count ++ 할 수있을 것 같아요 그렇지 않으면 ... 거기에 개체의 변수를 얻으려면 개체를 통해 실행할 수있는 쉬운 방법이 없다고 생각 ... 거기에 작은 함수로 준비 할 수 array_walk 하지만 당신은 그걸 사물에 적용 할 수 없다고 생각합니다. – Tobias

+0

그냥 배열의 개수를 찾고. 전체 배열이 필요하지 않습니다. 그래, 그건 사실이야, 그 배열을 만들고 그들을 계산 저장할 것입니다. – tnichols

답변

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

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); 
관련 문제