2013-04-30 4 views
1

다음과 같은 PHP stdclass 객체 배열이 있습니다. (실제로 내 인덱스는 수백 개이지만 목표는 동일합니다.) 그리고 가장 효율적인 방법을 찾는 데 어려움을 겪고 있습니다. PHP로 프로그래밍 방식으로 stdclass 객체가 배열에서 가장 자주 발생합니다.배열에서 가장 자주 발생하는 PHP stdclass 객체 결정

예를 들어 인덱스 0에있는 표준 클래스 객체가 가장 자주 발생하면 (분명히 그렇지 않은 경우) "1, 1024"또는 유사한 것을 반복합니다.

 
Array 
(
    [0] => stdClass Object 
     (
      [a] => 1 
      [b] => 1024 
     ) 

    [1] => stdClass Object 
     (
      [a] => 4 
      [b] => 4096 
     ) 

    [2] => stdClass Object 
     (
      [a] => 4 
      [b] => 4096 
     ) 

    [3] => stdClass Object 
     (
      [a] => 4 
      [b] => 4096 
     ) 

    [4] => stdClass Object 
     (
      [a] => 4 
      [b] => 4096 
     ) 

    [5] => stdClass Object 
     (
      [a] => 4 
      [b] => 4096 
     ) 

    [6] => stdClass Object 
     (
      [a] => 4 
      [b] => 4096 
     ) 

    [7] => stdClass Object 
     (
      [a] => 4 
      [b] => 6144 
     ) 

    [8] => stdClass Object 
     (
      [a] => 4 
      [b] => 6144 
     ) 

    [9] => stdClass Object 
     (
      [a] => 8 
      [b] => 6144 
     ) 

    [10] => stdClass Object 
     (
      [a] => 8 
      [b] => 6144 
     ) 

    [11] => stdClass Object 
     (
      [a] => 8 
      [b] => 8192 
     ) 

    [12] => stdClass Object 
     (
      [a] => 8 
      [b] => 8192 
     ) 

    [13] => stdClass Object 
     (
      [a] => 8 
      [b] => 8192 
     ) 

    [14] => stdClass Object 
     (
      [a] => 8 
      [b] => 8192 
     ) 
) 

고마워요!

+0

귀하의 접근 방법은 무엇입니까? –

+0

그리고 "배열에서 stdclass 객체가 가장 자주 발생합니다"라는 것은 무엇을 의미합니까? 각 객체는 인스턴스입니다. "같은 a, b-pairs를 가진 물건"을 의미합니까? –

+0

첫 번째 의견에서 언급했듯이 지금까지의 접근 방식은 무엇입니까? – dbf

답변

0

비록 어느 쪽이든 대답하지는 않았지만 특히이 솔루션을 사용하는 데 큰 도움이되었습니다.

$x = array(); 
$count = 0; 

for ($i = 0; $i < count($myArray); $i++) { 
    if ($myArray[$i]->a != $myArray[$i - 1]->a 
     && $myArray[$i]->b != $myArray[$i - 1]->b) { 
     $count = 0; 
    } 

    $x[$myArray[$i]->a . '|' . $myArray[$i]->b] = ++$count; 
} 

print_r($x); 

다음과 같은 결과가 나옵니다.

 
Array 
(
    [1|1024] => 1 
    [4|4096] => 5 
    [4|6144] => 3 
    [8|6144] => 2 
    [8|8192] => 4 
) 

그런 다음 해당 배열에서 가장 큰 값을 가져옵니다.

0

모든 레지스터를 검색하여 [배열]을 배열/맵에 저장하고 개수 기준으로 정렬 하시겠습니까?

0

나는이 권리가 필요하다고 생각합니까? 나는 그것이 꽤 빠르다라고 생각한다. 동일한 객체 또는 유사 객체의 인스턴스를 확인해야하는 경우에는 값을 연결하는 대신 spl_object_hash 함수를 사용하여 키를 생성 할 수 있습니다.

$foo = (object)['a' => 0, 'b' => 1024]; 
$bar = (object)['a' => 4, 'b' => 4096]; 
$qux = (object)['a' => 8, 'b' => 6144]; 

$array = []; 
foreach(range(1, 1024) as $i) $array[] = $foo; 
foreach(range(1, 4096) as $i) $array[] = $bar; 
foreach(range(1, 6144) as $i) $array[] = $qux; 

$result = []; 
array_walk($array, function($obj) use (&$result) { 
    $key = implode('|', get_object_vars($obj)); 
    if (isset($result[$key])) $result[$key]++; 
    else $result[$key] = 1; 
}); 

arsort($result); 
print_r($result); 

결과 :

Array 
(
    [8|6144] => 6144 
    [4|4096] => 4096 
    [0|1024] => 1024 
) 

감사합니다.

0

교환기가 == 인 경우 if objects are equal이 표시됩니다. 따라서 배열의 각 항목을 반복 할 수 있으며 각 값의 빈도를 추적하는 또 다른 배열을 작성할 수 있습니다. 그런 다음 결과 배열을 개수별로 정렬해야하므로 어떤 객체가 가장 자주 발생했는지 알 수 있습니다.

$orig = array(
    (object)array('a'=>3, 'b'=>'4096'), 
    (object)array('a'=>2, 'b'=>'2048'), 
    (object)array('a'=>2, 'b'=>'2048'), 
    (object)array('a'=>1, 'b'=>'1024'), 
    (object)array('a'=>1, 'b'=>'1024'), 
    (object)array('a'=>2, 'b'=>'2048'), 
    (object)array('a'=>1, 'b'=>'1024'), 
    (object)array('a'=>2, 'b'=>'2048'), 
); 

$countArray = array(); 

foreach($orig as $obj) { 
    $didCount = false; 
    foreach($countArray as $counted) { 
     if ($counted->value == $obj) { 
      $counted->count++; 
      // if we found a match, record that fact and 
      // break out of this loop early. 
      $didCount = true; 
      break; 
     } 
    } 

    // If no match was found, then this is the first time 
    // we've seen this particular value 
    if (!$didCount) 
     $countArray[] = (object)array(
      'count' => 1, 
      'value' => $obj, 
     ); 
} 

// To find the most frequent item, best way is to 
// sort $countArray by count. 
usort($countArray, function($left, $right) { 
    return $right->count - $left->count ; 
}); 

print_r($countArray[0]);