根据值进行的多维数组计数

时间:2019-04-09 17:49:12

标签: php arrays multidimensional-array counting

$feetypes=[
    [30,35,50],
    [30,35],
    [30,50],
    [30,34]
];

我有此代码,想按那里的值进行计数,例如count 30 * 4、35 * 2、50 * 2和34 * 1。

我已经尝试过:

$counts = array();
foreach ($array as $key=>$subarr) {
  // Add to the current group count if it exists
  if (isset($counts[$subarr['group']]) {
    $counts[$subarr['group']]++;
  }
  // or initialize to 1 if it doesn't exist
  else $counts[$subarr['group']] = 1;

  // Or the ternary one-liner version 
  // instead of the preceding if/else block
  $counts[$subarr['group']] = isset($counts[$subarr['group']]) ? $counts[$subarr['group']]++ : 1;
}

但我的问题仍然存在

3 个答案:

答案 0 :(得分:2)

您可以使用array_merge将所有内部数组合并为一个,然后使用array_count_values来获取计数。

$counts = array_count_values(array_merge(...$feetypes));

答案 1 :(得分:0)

将所有子数组合并为一个数组,并应用array_count_values函数以获取结果

function merageAll($arr) {
  $flatArray = array();
  foreach($arr as $element) {
    if (is_array($element)) {
        $flatArray = array_merge($flatArray, merageAll($element));
    } else {
        $flatArray[] = $element;
    }
  }
  return $flatArray;
 }
 $res = array_count_values(merageAll($feetypes));

结果

Array
(
 [30] => 4
 [35] => 2
 [50] => 2
 [34] => 1
)

function merage如果数组中有值和子数组,则所有功能均正常工作。

工作DEMO LINK

答案 2 :(得分:-1)

如果值的深度超过两个级别,则使用递归。请注意,由于递归,$ count变量通过引用传递给函数。

<?php
$feetypes=[
    [30,35,50],
    [30,35],
    [30,50],
    [30,34]
];

$counts = array();

function countValues($arr, &$count) {
    foreach($arr as $subval) {
        if(is_array($subval)) {
            countValues($subval,$count);
        } else {
            if(isset($count[$subval])) {
                $count[$subval] += 1;
            } else {
                $count[$subval] = 1;
            }
        }
    }
}

countValues($feetypes,$counts);
print_r($counts);