Сгруппированные данные массива

Я пытаюсь понять, как получить данные из следующей структуры данных. Мне удалось сгруппировать плоский массив в следующий массив, но мне трудно найти подходящие ресурсы, чтобы объяснить, как получить данные. Я хочу получить количество предметов в каждой группе. Затем я хотел бы распечатать идентификаторы из внутреннего массива ...

array (
  'grinds' => 
  array (
    0 => 
    array (
      'id' => 16562,
      'slug' => 'grinds',
    ),
    1 => 
    array (
      'id' => 16561,
      'slug' => 'grinds',
    ),
  ),
  'online-grinds' => 
  array (
    0 => 
    array (
      'id' => 16566,
      'slug' => 'online-grinds',
    ),
  ),
)

Откуда этот массив? Можете ли вы суммировать в источнике (предположительно на уровне db?)

WillardSolutions 10.12.2018 18:13

Не могли бы вы показать нам, что вы сделали до сих пор? Я предполагаю, что вы должны хотя бы попробовать цикл foreach или 2

RiggsFolly 10.12.2018 18:16

Спасибо за ответ, ребята. Я пробовал цикл foreach, но не смог успешно реализовать внутренний цикл foreach, как продемонстрировал EvE в принятом ответе.

hotshots 10.12.2018 20:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
$my_array1 = array(
    'grinds' =>
        array(
            0 =>
                array(
                    'id' => 16562,
                    'slug' => 'grinds',
                ),
            1 =>
                array(
                    'id' => 16561,
                    'slug' => 'grinds',
                ),
        ),
    'online-grinds' =>
        array(
            0 =>
                array(
                    'id' => 16566,
                    'slug' => 'online-grinds',
                ),
        ),
);

получить подсчеты:

$counts = array();
foreach ($my_array1 as $key => $val) {
    $counts[$key] = count($val);
}
var_dump($counts);

дает:

array(2) {
    ["grinds"]=>
    int(2)
    ["online-grinds"]=>
    int(1)
}

получить внутренние идентификаторы:

$innerids = array();
foreach ($my_array1 as $key => $val) {
    foreach ($val as $key2 => $val2) {
        $innerids[] = $val2['id'];
    }
}
var_dump($innerids);

дает:

array(3) {
    [0]=>
    int(16562)
    [1]=>
    int(16561)
    [2]=>
    int(16566)
}

Спасибо за это. Это именно то, чего я пытался достичь, и помогло мне лучше понять, как получить доступ к внутреннему массиву.

hotshots 10.12.2018 20:23

Вы можете использовать array_map, а затем для каждого элемента использовать array_column и указать имя поля, а затем использовать array_count_values для подсчета уникальных значений.

Затем объедините их в массив и снова используйте существующий ключ в качестве ключа для нового массива.

$arrays = array_map(function($x) {
    return [
        array_count_values(array_column($x, 'id')),
        array_count_values(array_column($x, 'slug'))
        ];
}, $arrays);

print_r($arrays);

Результат

Array
(
    [grinds] => Array
        (
            [0] => Array
                (
                    [16562] => 1
                    [16561] => 1
                )

            [1] => Array
                (
                    [grinds] => 2
                )

        )

    [online-grinds] => Array
        (
            [0] => Array
                (
                    [16566] => 1
                )

            [1] => Array
                (
                    [online-grinds] => 1
                )

        )

)

Демо

Спасибо за это. Это определенно работает и удовлетворяет мои потребности. Я принял другой ответ от Евы, так как это было именно то, что я пытался реализовать, но не преуспел в этом.

hotshots 10.12.2018 20:27

Другие вопросы по теме