计算多维数组的每个类别中的项目

时间:2015-02-04 15:08:37

标签: php arrays 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,但我对这个功能不满意。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:0)

如果您的阵列不是太大,那么直接的方法可能是最简单的方法。创建一个新数组,使用类别作为键并迭代数组,计算项目。

答案 1 :(得分:0)

你可以使用这样的东西

$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个数组:一个包含计数,另一个包含重新排列的元素

答案 2 :(得分:0)

我写了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]);

}

我希望这会有所帮助,编码很快。

答案 3 :(得分:0)

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

$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/>";
}