从几个多维数组计数

时间:2009-08-19 12:51:24

标签: php arrays count elements

我有foreach,它生成以下数组:

==== array 1 ====
array
  0 => 
    array
      'tag' => string 'daf' (length=3)
  1 => 
    array
      'tag' => string 'daa' (length=3)
  2 => 
    array
      'tag' => string 'daf' (length=3)
  3 => 
    array
      'tag' => string 'daaa' (length=4)
  4 => 
    array
      'tag' => string 'daf' (length=3)
  5 => 
    array
      'tag' => string 'daa' (length=3)
  6 => 
    array
      'tag' => string 'daf' (length=3)
  7 => 
    array
      'tag' => string 'daf' (length=3)
  8 => 
    array
      'tag' => string 'daf' (length=3)
  9 => 
    array
      'tag' => string 'abd' (length=3)
  10 => 
    array
      'tag' => string 'abdaa' (length=5)
  11 => 
    array
      'tag' => string 'abda' (length=4)

==== array 2 ====    
array
  0 => 
    array
      'tag' => string 'daf' (length=3)
  1 => 
    array
      'tag' => string 'test1' (length=5)

作为输出我希望得到类似的东西:

array
  'daf' => '7'
  'daa' => '2'
  'daaa' => '1'
  'abd' => '1'
  'abdaa' => '1'
  'abda' => '1'
  'test1' => '1'

新数组的值是来自循环的所有aray generatet的元素的计数。 array_count_values()在这里不起作用...任何建议,如何解决问题?

3 个答案:

答案 0 :(得分:4)

没有注意到它是二维数组。

这是另一个代码。

var_export(
    array_count_values(
        call_user_func_array('array_merge', array_merge($array1, $array2))
    )
);

答案 1 :(得分:2)

有点像这样的东西应该有效:

$result = array();
foreach (array_merge($array1, $array2) as $item) {
    $name = $item['tag'];   
    if (!isset($result[$name])) {
        $result[$name] = 0;   
    } 

    $result[$name]++;
}

答案 2 :(得分:2)

让我们使用Standard PHP Library (SPL) 您可以使用RecursiveArrayIteratorRecursiveIteratorIterator“展平”数组。因此,您将获得一个迭代器,该迭代器访问您的n维数组的每个叶子,并且仍然可以访问该元素的实际键。在下一步中,将具有AppendIteratorFilterIterator的RecursiveIteratorIterator连接起来,就像访问其所有内部(附加)迭代器中的每个元素一样。

$ai = new AppendIterator;
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array1)));
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array2)));
$counters = array();
foreach($ai as $key=>$value) {
  if ( 'tag'===$key ) {
    // @ because I don't care whether this array element exists beforehand or not.
    // $value has to be something that can be used as an array key (strings in this case)
    @$counters[$value] += 1;
  }
}

如果您愿意,甚至可以使用{{3}}代替if('tag'===$key)。但imho这不会增加代码的可读性/值; - )