在PHP中将数组合并到随机索引的已建立数组中

时间:2014-11-10 22:49:22

标签: php arrays multidimensional-array array-merge array-splice

我正在建立一个图片库,并想在随机点投放一些促销横幅,以向用户宣传某些优惠。鉴于已从数据库查询中筛选出以下两个数组:

媒体图片阵列:

 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 维护排序顺序?

即将促销横幅添加到图像的时间线中。

2 个答案:

答案 0 :(得分: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);

唯一需要注意的是,我的媒体和促销数组都是基于数字索引的,从零开始是连续的,这是数组的默认值,而不是像你在14所发布的数组一样密钥将从媒体阵列中删除。

答案 1 :(得分:0)

如果您没有大量图像(例如,最多100个),请随意“手动”创建阵列。首先,您应该创建一个数组,其中包含促销项的位置。你知道内容数组中的项目数,promo数组中的项目数;它们的总和将是最终数组的大小。找出一些智能数学,计算促销项目的位置(例如,不要在第一个和最后一个位置放置促销,不要在相邻位置放置两个促销项目,也许你必须unset()一些促销项目,如果促销商品多于内容商品。

如果您有促销位置,您可以走内容项目,将它们复制到最终阵列中。在内容复制之前,您应该检查当前位置是否为促销项目保留,如果是,则应首先复制促销项目。瞧,你有一个最终的项目清单,促销项目是交错的。

由于自动更新(您不必为深层元素创建父节点),PHP是这类任务的不错选择。编程,特别是网页是:

  1. 将一些数据项挖掘到数组中(来自SQL,JSON,API调用)
  2. 创建具有不同索引的最终数组(可能会出现合并/求和项)
  3. 排序,过滤,查找其他字段的其他数组
  4. 显示最终数组
  5. 类似任务出现在求职面试问题中(扫描数组,计算/求和/合并某些内容)。