如果一个元素在多个数组中相同,则随机选择一个数组?

时间:2013-07-06 18:24:14

标签: php arrays

我有1个多维数组:

$adverts = array(array('text'=>'test', 'location' => 'location1'), array('text'=>'test', 'location' => 'location2'), array('text'=>'test', 'location' => 'location1'))

如您所见,该多维数组中的两个数组包含location元素的相同文本。

如何检测到这一点,并在foreach循环中随机选择其中一个,如下所示:

foreach ($adverts as $advert)
        {

            if ($hookName == $advert['advert_location'] && XenForo_Helper_Criteria::userMatchesCriteria($advert['user_criteria']))
            {
                $contents .= $advert['advert_code'];
            }
        }

(我知道数组不匹配)

在该foreach循环中,正在根据预定义值检查多维数组中每个数组的location。如果多维数组中的多个数组具有相同的location,我只想使用其中一个 - 换句话说,内容不会多次针对同一位置进行修改。

但是,它应该使用每个匹配值的随机数组。

这是可能的,你明白了吗?它将如何完成?

2 个答案:

答案 0 :(得分:3)

只需将它们分配到位置,然后在每次循环时随机选择

$group = array_reduce($adverts, function ($a, $b) {
    $a[$b['location']][] = $b;
    return $a;
});

$contents = array();
foreach($group as $adverts) {
    $contents[] = $adverts[mt_rand(0, count($adverts) - 1)];
}

print_r($contents);

See Example

答案 1 :(得分:2)

您可以使用array_filter仅过滤掉符合条件的元素,然后使用数组rand选择随机元素。

 $array = array_filter($array, function($el) use $location{
       return $el["location"] == $location;
 });

 if (count($array) > 1){
     $selected = $array(array_rand($array));
 } elseif (count($array) == 0){
     $selected = $array[0];
 } else {
     $selected = null;
 }

注意这需要php 5.3