У меня многомерный массив, и мне нужно подсчитать, сколько элементов в каждой категории:
array (
array(
'name' => 'Bob',
'category' => '2'
),
array(
'name' => 'Bill',
'category' => '6'
),
array(
'name' => 'John',
'category' => '1'
),
array(
'name' => 'Jack',
'category' => '2'
),
)
Я хочу иметь возможность разделить их на категории.
Например;
Просто, чтобы получить подсчет каждой категории, было бы здорово, но возможность переупорядочить массив по категориям также была бы полезна. Я хотел бы иметь возможность сделать то и другое.
Я попытался найти StackOverflow, но я не смог найти этот конкретный запрос. Я предполагаю, что это может использовать array_map
где-нибудь, но я не очень хорошо array_map
этой функции.
Любая помощь очень ценится!
Попробуйте этот путь, я думаю, что он выполнит ваши требования.
$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/>";
}
Я написал 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 массива: один со счетчиками и один с перегруппированными элементами
Если ваш массив не слишком большой, простой подход может быть самым простым. Создайте новый массив, используйте категории в качестве ключей и итерации по вашему массиву, подсчет элементов.