对多维数组的每个类别中的项目进行计数


Counting items in each category of a multidimensional array

我有一个多维数组,我需要计算每个类别中有多少项目:

array (
    array(
       'name' => 'Bob',
       'category' => '2'
    ),
    array(
       'name' => 'Bill',
       'category' => '6'
    ),
    array(
    'name' => 'John',
    'category' => '1'
    ),
    array(
       'name' => 'Jack',
       'category' => '2'
    ),
 )

我希望能够将它们分成几类。

例如;

  • 类别 2 包含 2 件商品
  • 类别 1 包含 1 件商品
  • 类别 6 包含 1 件商品

只是获取每个类别的计数会很棒,但能够将数组重新排列成类别也很有用。我希望能够做到这两点。

我尝试搜索StackOverflow,但找不到这个特定的查询。我猜这可能会在某处使用array_map,但我不擅长该功能。

任何帮助将不胜感激!

如果您的数组不是太大,那么简单的方法可能是最简单的方法。创建一个新数组,使用类别作为键,并遍历数组,对项目进行计数。

我写了 3 个函数来解决您描述的标准。请记住,这些函数是最低限度的,缺乏错误处理。还假设所有函数所需的$categories数组具有问题中概述的结构。

第一个将所有项目重新排列到正确的类别中。

function rearrangeCategories(array $categories) {
    $calculated = [];
    foreach($categories as $category) {
        $calculated[$category['category']][] = $category['name'];
    }
    return $calculated;
}

第二个创建每个类别中项目数量的关联数组。数组索引是类别名称/ID,值是声明项目数量的整数。

function categoriesCount(array $categories) {
    $calculated = [];
    $arranged   = rearrangeCategories($categories);
    foreach($arranged as $category => $values) {
        $calculated[$category] = count($values);
    }
    return $calculated;
}

第三个函数检查特定类别中存储了多少项。如果类别不存在FALSE则返回。否则返回整数。

function categoriesItemCount(array $categories, $key) {
    $arranged = rearrangeCategories($categories);
    if(!array_key_exists($key, $arranged)) {
        return false;
    }
    return count($arranged[$key]);
}

我希望这有帮助,快乐编码。

你可以使用这样的东西

$arr =
array (
    array(
        'name' => 'Bob',
        'category' => '2'
    ),
    array(
        'name' => 'Bill',
        'category' => '6'
    ),
    array(
        'name' => 'John',
        'category' => '1'
    ),
    array(
        'name' => 'Jack',
        'category' => '2'
    ),
);
$categoryCount = array();
$categoryList = array();
array_map(function($a) use (&$categoryCount, &$categoryList) {
    $categoryId = $a['category'];
    if (!isset($categoryCount[$categoryId])) {
        $categoryCount[$categoryId] = 0;
    }
    $categoryCount[$categoryId]++;
    if (!isset($categoryList[$categoryId])) {
        $categoryList[$categoryId] = array();
    }
    $categoryList[$categoryId][] = $a['name'];
}, $arr);
print_r($categoryCount);
print_r($categoryList);

这将创建 2 个数组:一个包含计数,另一个包含重新排列的元素

试试这种方式,我认为它会满足您的要求。

$arr=array (
    array(
        'name' => 'Bob',
        'category' => '2'
    ),
    array(
        'name' => 'Bill',
        'category' => '6'
    ),
    array(
        'name' => 'John',
        'category' => '1'
    ),
    array(
        'name' => 'Jack',
        'category' => '2'
    ),
);
$result = call_user_func_array('array_merge_recursive', $arr);
//for just show array
  print '<pre>';
  print_r(array_count_values($result['category']));
  print '</pre>';
//loop as you need
foreach(array_count_values($result['category']) as $k=>$v){
    $item=($v>1)? 'items':'item';
    echo "Category ".$k." Contains " .$v." ".$item."<br/>";
}