Подсчет элементов в каждой категории многомерного массива

0

У меня многомерный массив, и мне нужно подсчитать, сколько элементов в каждой категории:

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 где-нибудь, но я не очень хорошо array_map этой функции.

Любая помощь очень ценится!

  • 0
    Где хранятся элементы категории? Количество связано количество предметов или это идентификатор? Также имя является названием категории?
  • 0
    Это просто означает, что первый предмет Боб находится в категории 2, Билл в категории 6 ... и так далее ...
Показать ещё 1 комментарий
Теги:
arrays
multidimensional-array

4 ответа

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

}

Надеюсь, это поможет, счастливая кодировка.

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 массива: один со счетчиками и один с перегруппированными элементами

0

Если ваш массив не слишком большой, простой подход может быть самым простым. Создайте новый массив, используйте категории в качестве ключей и итерации по вашему массиву, подсчет элементов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню