Объединить массив в установленный массив при случайных индексах в переполнении стека

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

Массив медиа-изображений:

 Array
(
[0] => Array
(
[insertDate] => 2014-11-10 11:22:58
[keyword] => standard
[mediaClass] => image
[mediaURL] => http://image1.jpg
[promoURL] =>
)

[2] => Array
(
[insertDate] => 2014-11-10 11:23:18
[keyword] => standard
[mediaClass] => image
[mediaURL] => http://image3.jpg
[promoURL] =>
)

[3] => Array
(
[insertDate] => 2014-11-10 11:23:28
[keyword] => standard
[mediaClass] => image
[mediaURL] => http://image4.jpg
[promoURL] =>
)

[5] => Array
(
[insertDate] => 2014-11-10 11:23:48
[keyword] => standard
[mediaClass] => image
[mediaURL] => http://image6.jpg
[promoURL] =>
)
)

Массив промо изображений:

    Array
(
[1] => Array
(
[insertDate] => 2014-11-10 11:23:08
[keyword] => promo
[mediaClass] => image
[mediaURL] => http://image2.jpg
[promoURL] => http://www.google.com
)

[4] => Array
(
[insertDate] => 2014-11-10 11:23:38
[keyword] => promo
[mediaClass] => image
[mediaURL] => http://image5.jpg
[promoURL] => http://www.google.com
)
)

Как я могу вставить рекламный изображения в средства массовой информации массив изображений со случайными индексами при сохранении порядка сортировки insertDate медиа-изображений?

Т.е. добавление рекламных баннеров в хронологию изображений.

0

Решение

Вот что я бы сделал:

<?php
$promo = Array (
Array ('insertDate' => '2014-11-10 11:23:08', 'keyword' => 'promo', 'mediaClass' => 'image', 'mediaURL' => 'http://image2.jpg', 'promoURL' => 'http://www.google.com'),
Array ('insertDate' => '2014-11-10 11:23:38', 'keyword' => 'promo', 'mediaClass' => 'image', 'mediaURL' => 'http://image5.jpg', 'promoURL' => 'http://www.google.com')
);

$media = Array (
Array ('insertDate' => '2014-11-10 11:22:58', 'keyword' => 'standard', 'mediaClass' => 'image', 'mediaURL' => 'http://image1.jpg', 'promoURL' => '', ),
Array ('insertDate' => '2014-11-10 11:23:18', 'keyword' => 'standard', 'mediaClass' => 'image', 'mediaURL' => 'http://image3.jpg', 'promoURL' => '', ),
Array ('insertDate' => '2014-11-10 11:23:28', 'keyword' => 'standard', 'mediaClass' => 'image', 'mediaURL' => 'http://image4.jpg', 'promoURL' => '', ),
Array ('insertDate' => '2014-11-10 11:23:48', 'keyword' => 'standard', 'mediaClass' => 'image', 'mediaURL' => 'http://image6.jpg', 'promoURL' => '', )
);

//sort the promo in random order. This ensures they go into media in random order
shuffle($promo);

//get random keys to insert the promo image before
$randKeys = array_rand($media, count($promo));
//sort by the random key value in reverse. By inserting in reverse order,
//we won't have an issue with needing to increment keys to prevent two promo
//images ending up next to each other. Also, this is why we shuffle the promo
//array above, so the promo images go in random order because this is no longer random.
rsort($randKeys);

//loop over the random keys and insert the next promo image before each key
foreach($randKeys as $key){
//get the first promo image and remove it
$promoImage = array_shift($promo);
//splice the promo image into the media array
array_splice($media, $key, 0, array($promoImage));
}

//display
print_r($media);

Единственное, на что следует обратить внимание, это то, что и мои массивы мультимедиа, и промо-массивы имеют числовой индекс, начиная с нуля и непрерывно, что по умолчанию для массива, а не для массивов, которые вы разместили там, где они 1 а также 4 ключи удалены из массива медиа.

0

Другие решения

Если у вас нет тонны изображений (скажем, максимум 100), не стесняйтесь создавать массивы «вручную». Во-первых, вы должны создать массив, который содержит позиции элементов промо. Вы знаете количество элементов в массиве контента, количество элементов в промо-массиве; их сумма будет окончательным размером массива. Выясните некоторую умную математику, которая вычисляет позиции промо-предметов (например, не размещайте промо на первом и последнем месте, не ставьте два промо-элемента на соседние позиции, возможно, вам придется unset() некоторые промо-элементы, если промо-элементов больше, чем элементов контента).

Если у вас есть промо-позиции, вы можете пройтись по элементам контента, скопировав их в окончательный массив. Перед копированием контента следует проверить, зарезервирована ли текущая позиция для промо-позиции, если да, промо-элемент должен быть скопирован первым. Вуаля, у вас есть окончательный список товаров, чередуются промо-материалы.

PHP — хороший выбор для такого рода задач, благодаря автовивификации (вам не нужно создавать родительские узлы для элемента с глубоким размещением). Программирование, особенно веб-страницы:

  1. копировать некоторые элементы данных в массив (из SQL, JSON, API-вызова)
  2. создать окончательный массив с другим индексом (возможно, происходит слияние / суммирование элементов)
  3. сортировать, фильтровать, искать другие массивы для других полей
  4. отобразить окончательный массив

Подобные задачи появляются в вопросах собеседования (сканирование через массив и подсчет / суммирование / слияние чего-либо).

0