0

我有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值,我只想使用其中一个 - 换句话说,同一位置的内容不会被多次修改。

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

这可能吗,您是否理解它以及如何完成?

4

2 回答 2

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);

查看示例

于 2013-07-06T18:32:34.407 回答
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

于 2013-07-06T18:34:02.547 回答