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

0

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

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

 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 медиа-изображений?

т.е. добавление рекламных баннеров во временную шкалу изображений.

Теги:
arrays
multidimensional-array
array-merge
array-splice

2 ответа

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
    Спасибо Джонатан, этот метод решил проблему для меня, я использовал array_values, чтобы сбросить индексы двух массивов после фильтрации, чтобы разделить их
0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню