vechnokrainii
@vechnokrainii
ну почти всегда(

Как вытащить значения из многомерного массива без двух foreach?

Здравствуйте! У меня такая проблема. У меня есть два массива с товаром($deals) и с рекламой ($ads)
$deals
array( 
    [0] => array(
        'id' => 111
        'price' => 500
     )
    [1] => array(
        'id' => 222
        'price' => 500
// и так далее

$ads
array(
    [0] => array(
         'id' => 101010
         'idDeal' => 111
        'dateStop' => 10.11.20
    )
    [1] => array(
         'id' => 202020
         'idDeal' => 111
        'dateStop' => 10.09.20
    )
    [2] => array(
         'id' => 303030
         'idDeal' => 222
        'dateStop' => 10.05.20
    )
// и так далее

Как видно из примера у меня есть массив со всеми товарами и массив историей публикации этих товаров. Полей гораздо больше но я вывел только те которые нужны. В массивы связаны по полям id и idDeal.
Проблема в том что мне нужно получить итоговую таблицу, где будут все товары и в одном из столбоц будет указана дата окончания публикации. Если товар ушел из рекламы то в таблице долдны быть последния запись когда товар публиковался. В одном товаре стоит дата 15.11.20 и сотрудник видит что товар находится в рекламе, а в другом товаре стоит 5.10.20 значит товар последний раз был в рекламе пятого октября. Проблема в том что в массиве $ads хранятся вся история публикаций по тем товарам которые в массиве $deals. И записей может быть много, а нужно брать только последнюю.
Пытался через два foreach ну так как все 15000 товаров и по каждому может быть до 10 записей. То очень долго отрабатывает.
В итоге нужно получить массив $deal c указаной датой последней публикации
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
@vdem
Конечно, как написали выше, нужно постараться решить вопрос на уровне запроса к БД. Но вот так тоже будет работать, и притом довольно шустро. Один момент: дату, вероятно, следует перевести в формат здорового человека (год-месяц-день).
$dealsMap = array_combine(array_column($deals, 'id'), $deals);
print_r($dealsMap);
foreach ($ads as $ad) {
    $idDeal = $ad['idDeal'];
    if (!isset($dealsMap[$idDeal]['dateStop'])
            || ($dealsMap[$idDeal]['dateStop'] < $ad['dateStop'])) {
        $dealsMap[$idDeal]['dateStop'] = $ad['dateStop'];
    }
}

print_r($dealsMap);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы