Как проверить, существует ли значение массива в другой группе массивов

У меня есть массив, содержащий даты последних 7 дней, этот массив создается с помощью цикла o.

    $now = new \DateTime();
    $startDate = $now->modify('-6 day');
    $labels = [];
    $data = [];
    for ($i = 0; $i <= 6; $i++) {
        $day =  $startDate->modify('+1 day');
        $labels[] = $day->format('Y-m-d');
    }

и это вывод $labels:

$labels = array:7 [▼
  0 => "2023-07-05"
  1 => "2023-07-06"
  2 => "2023-07-07"
  3 => "2023-07-08"
  4 => "2023-07-09"
  5 => "2023-07-10"
  6 => "2023-07-11"
]

И у меня есть запрос на выбор количества просмотров элемента (свойства) в эти даты. Этот запрос может вернуть 7 строк, так как он может вернуть менее 7 или 0 строк, если в какой-либо из дней нет просмотров. В моем случае у меня есть посещения только за последние два дня, и это результат:

$result = array:2 [▼
  0 => array:2 [▶
    "numberViews" => 20
    "dayDate" => "2023-07-10"
  ]
  1 => array:2 [▶
    "numberViews" => 32
    "dayDate" => "2023-07-11"
  ]
]

Что я хотел бы сделать, так это проверить каждую дату в первом массиве, если она существует в группе массивов, возвращаемых запросом, если она не существует, поэтому она должна быть равна нулю, и сделать массив данных следующим образом:

$data = [0,0,0,0,0,20,32]
Стоит ли изучать 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 и хотите разрабатывать...
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала вам нужно инициализировать ваш массив $data, чтобы он имел те же ключи массива, что и ваш массив $labels.

for ($i = 0; $i <= 6; $i++) {
    $day =  $startDate->modify('+1 day');
    $labels[] = $day->format('Y-m-d');
    $data[] = 0;
}

Теперь вы можете перебрать свой массив $result и использовать функцию php array_search для подсчета количества просмотров.

foreach($result as $item)
{
    $foundKey = array_search($item['dayDate'], $labels);
    if ($foundKey !== false)
    {
        $data[$foundKey] += $item['numberViews'];
    }
}

Вы можете сделать это в два простых шага:

  1. создать массив с метками в качестве индексов и 0 в качестве значений;
  2. пройдитесь по $result и замените 0 на количество просмотров для дат, представленных в $result.
$labels = [
  0 => "2023-07-05",
  1 => "2023-07-06",
  2 => "2023-07-07",
  3 => "2023-07-08",
  4 => "2023-07-09",
  5 => "2023-07-10",
  6 => "2023-07-11",
];

$result = [
  0 => [
    "numberViews" => 20,
    "dayDate" => "2023-07-10",
  ],
  1 => [
    "numberViews" => 32,
    "dayDate" => "2023-07-11",
  ],
];

// 1. create the output array; set the dates/labels as keys and 0 as values
$output = array_fill_keys($labels, 0);
// 2. fill the number of views for the dated that have views
foreach ($result as $day) {
  // Modify only the values that exist in $output
  if (isset($output[$day['dayDate']])) {
    // Use addition instead of assignment to guard for duplicate dates in $result
    $output[$day['dayDate']] += $day['numberViews'];
  }
}

print_r($output);

Вы можете объединить шаг № 1 в свой существующий код, чтобы сгенерировать $output вместо $labels (и вам больше не нужен шаг № 1 выше):

    $now = new \DateTime();
    $startDate = $now->modify('-6 day');
    $output = [];
    $data = [];
    for ($i = 0; $i <= 6; $i++) {
        $day =  $startDate->modify('+1 day');
        $output[$day->format('Y-m-d')] = 0;
    }

Проверьте это онлайн.

Этот ответ не будет работать должным образом. Предполагая, что у вас есть dayDate "2023-06-01" в вашем массиве $result, это также будет добавлено в массив $output. Далее у вас будет неправильное количество просмотров, если в вашем массиве $result будет две записи с одинаковым dayDate.

Mogens 10.07.2023 09:05

Я согласен с первым недостатком, но зачем $result содержать несколько записей с одним и тем же dayDate?

axiac 10.07.2023 09:32

Я не знаю. :-) Не должна. Но функция для создания массива $result неизвестна. И благодаря навыкам аскеров это могло произойти.

Mogens 10.07.2023 09:36

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