2014-04-11 70 views
0

我在試圖找出這個問題時遇到了實際問題。在多維數組中計數不同的值

我有一個PHP數組,看起來像這樣:

$info = array(); 

$info[0] = array(
    'car' => 'Audi', 
    'previous_car' => 'BMW' 
    ); 

$info[1] = array(
    'car' => 'Audi', 
    'previous_car' => 'Seat' 
    ); 

$info[2] = array(
    'car' => 'Audi', 
    'previous_carg' => 'BMW' 
    ); 

$info[3] = array(
    'car' => 'BMW', 
    'previous_car' => 'BMW' 
    ); 

$info[4] = array(
    'car' => 'Ford', 
    'previous_car' => 'Seat' 
    ); 

我需要做一些這方面的排序,所以結果看起來是這樣的:

Array (
    car [ 
     'Audi' => 3, 
     'BMW' => 1, 
     'Ford' => 1 
    ], 
    previous_car [ 
     'BMW' => 3, 
     'Seat' => 2 
    ] 

); 

我需要統計不同事件在同一個鍵上有一個值,但搜索是在兩個數組上進行的。我試圖使用array_value_count(),但我不適合多維數組。

我想避免循環,因爲如果數組很大可能會過度。

我將非常感謝所有的幫助。

+0

這個問題將有助於你這是lalready問這裏.. http://stackoverflow.com/questions/6460993/get-the-keys-for-duplicate-values-in-an-array –

+0

的可能重複[在多維數組中計數特定值](http://stackoverflow.com/questions/11558397/count-specific-values-in-multidimensional-array) –

回答

1

在一個更面向對象的方法可以解決這個問題如下

$values = new ArrayObject(); 
$iterator = new RecursiveArrayIterator($info); 
iterator_apply($iterator, 'countDistinct', array($iterator, $values)); 

function countDistinct($iterator, $values) { 
    while ($iterator -> valid()) { 
     if ($iterator -> hasChildren()) { 
      countDistinct($iterator -> getChildren(), $values); 
     } else { 
      if (!$values->offsetExists($iterator->key())) { 
       $values->offsetSet($iterator->key(), new ArrayObject()); 
      } 

      if (!$values->offsetGet($iterator->key())->offsetExists($iterator->current())) { 
       $values->offsetGet($iterator->key()) 
        ->offsetSet($iterator->current(), 1); 
      } else { 
       $values->offsetGet($iterator->key()) 
        ->offsetSet($iterator->current(), 
       $values->offsetGet($iterator->key())->offsetGet($iterator->current()) + 1); 
      } 
     } 

     $iterator -> next(); 
    } 
} 

當然,這個例子中,你不避環。但是使用ArrayObject和RecursiveArrayIterator,您將擁有一些內存和性能優勢。

這樣的結果將與您期望的結果完全匹配,您可以輕鬆地使用ArrayObject的getIterator()函數進行迭代。

+0

太棒了!非常感謝你! – mephisto4

0

如果你正在運行PHP 5.5,你可以使用:

$newArray = array(
    'car' => array_count_values(array_column($info, 'car')), 
    'previous_car' => array_count_values(array_column($info, 'previous_car')) 
); 
var_dump($newArray); 

對於PHP的5.5之前的版本

$newArray = array(
    'car' => array_count_values(
     array_map(
      function($value) { 
       return $value['car']; 
      }, 
      $info 
     ) 
    ), 
    'previous_car' => array_count_values(
     array_map(
      function($value) { 
       return $value['previous_car']; 
      }, 
      $info 
     ) 
    ) 
); 
var_dump($newArray); 
+0

不幸的是,服務器運行PHP 5.4.9 – mephisto4

+0

轉儲$ newArray只給出:'code' array(2){[「car」] => array(0){} [「previous_car」] => array(0){}}'code' – mephisto4

+0

http://ideone.com/QMtRpf –

0

這裏是可以幫助你:

$returnArray = array('car' => NULL, 'previous_car' => NULL); 

foreach($info as $newInfo) { 
    $returnArray['car'][] = $newInfo['car']; 
    $returnArray['previous_car'][] = $newInfo['previous_car']; 
} 

$ret['car'] = array_count_values($returnArray['car']); 
$ret['previous_car'] = array_count_values($returnArray['previous_car']); 

var_dump($ret); 

這將返回:

array (size=2) 
    'car' => 
    array (size=3) 
     'Audi' => int 3 
     'BMW' => int 1 
     'Ford' => int 1 
    'previous_car' => 
    array (size=2) 
     'BMW' => int 3 
     'Seat' => int 2 
+0

$ returnArray的var_dump僅在'code'數組中得到(2){[「car」] => array(0){} [「previous_car」] => array(0){}} – mephisto4

+0

更新了答案。希望能幫助到你! – Guns