2014-04-11 43 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