ragnar_ok
@ragnar_ok

Как подсчитать только вложенные элементы массива без родительских?

Как подсчитать только вложенные элементы массива без родительских?
Как избежать использования циклов для этого?
Я прикинул только такой вариант.
$array = [
    ['foo', 'bar'],
    ['foo', 'bar']
];

$diff = count($array, 1) - count($array);
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Добро пожаловать в пхп. Ты нащупал одну из мощнейших его проблем, которую никакой авторитетный пхпшник никогда не признает.

В пыхе нет разделения на пачку и штуку.
Здесь есть обьекты, которым надо писать чертов класс. Каждый раз. Каждую минуту.

Сначала по существу, потом о вечном...

Количество родительского - 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 или другой обьект. В общем дикт это ленивый обьект. Впадлу писать класс и вообще тут одну задачку решить, не хочется - вот тебе дикт.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы