Добро пожаловать в пхп. Ты нащупал одну из мощнейших его проблем, которую никакой авторитетный пхпшник никогда не признает.
В пыхе нет разделения на пачку и штуку.Здесь есть обьекты, которым надо писать чертов класс. Каждый раз. Каждую минуту.
Сначала по существу, потом о вечном...
Количество родительского - count($array);
Когда ты поставил в count() вторым параметром единицу - ты посчитал сумму количеств во всех элементах. Потом отнял количество в главном массиве. Технически ты получил ответ, но сама задача - сначала сделать пачку-пачек а потом посчитать количество элементов во всех пачках без учета основной пачки - это немного странно
Если у тебя пачка пачек - тебе может пригодится посчитать число в каждой пачке. Или число в главной пачке. А если тебе нужна сумма во всех пачках - то это не должна быть пачка пачек - это должна быть одна пачка, в противном случае мы вводим понятие "агрегация" - группировка внутренних элементов по некоему признаку, и тут полюбому форич и циклы.
Но ты в общем-то вышел из положения, так что не скажу что ты делаешь неправильно. Но попробуй ради тренировки поставить задачу по другому.
Вот тебе функции из моей библиотеки:
// is_array
// проверяет массив на ключи - цифровые, идущие по порядку с 0
function _is_array($array) : bool
{
if (! is_array($array)) return false;
if (! $array) return true; // empty array is array too
$i = count($array);
while ($i-- && ! array_key_exists($i, $array)) return false;
return true;
}
// is_list
// проверяет является ли массив - списком (list) без буквенных ключей. цифровые ключи в отличие от array могут идти в любом порядке
function _is_list($array) : bool
{
if (! is_array($array)) return false;
if (! $array) return true; // empty list is list too
// contains string key? not a list
foreach (array_keys($array) as $key) {
if (is_string($key)) return false;
}
return true;
}
// is_assoc
// проверяет, является ли массив "грязным" - содержит хотя бы один строковый ключ
function _is_assoc($array) : bool
{
if (! is_array($array)) return false;
if (! $array) return false; // empty assoc is not an assoc
// contains string key? there's assoc
$result = false;
foreach (array_keys($array) as $key) {
if (! is_string($key)) continue;
$result = true;
break;
}
return $result;
}
// is_dict
// проверяет, является ли массив - словарем (dict), без цифровых и пустых ключей
function _is_dict($array) : bool
{
if (! is_array($array)) return false;
if (! $array) return false; // empty dict is not a dict
foreach (array_keys($array) as $key) {
if (is_int($key)) return false; // 0,1,2
if (! $key) return false; // null, ''
}
return true;
}
Теперь
массив для тебя - это пачка чего-то.
Лист, или список - это пачка которая прошла через фильтры (обычно функции фильтрации не изменяют ключей, а просто выбрасывают лишние), или это еще бывает пачка привязанная к таблице-связке в many-to-many.
Assoc - это фарш того и этого. Желательно делать их пореже, но местами бывает когда надо взлететь с "некоторые значения не имеют ключей и их подставить по порядку, а те которые с ключами - использовать как есть".
Dict - полноценный словарь, ключ-значение, являющийся единицей, которую надо класть в массив целиком и воспринимать как цельную сущность.
Вместо Dict можно использовать new StdClass или другой обьект. В общем дикт это ленивый обьект. Впадлу писать класс и вообще тут одну задачку решить, не хочется - вот тебе дикт.