2013-07-06 25 views
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我只想使用其中的一個 - 換句話說,內容不會被多次修改爲同一位置。

但是,它應該使用來自每個匹配值的隨機數組。

這是可能的,你是否理解它,它將如何完成?

回答

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

+0

這將是恕我直言,最好使用'array_walk',而不是'array_reduce'因爲傳達了什麼事情發生更好。當然這是一個非常小的細節。 – Jon

+0

'array_walk'既可以修改數組,也可以強制我使用'global',這就是爲什麼我使用'array_reduce' ......你能給出一個例子嗎? – Baba

+0

@Baba:你真的不需要任何一個。 '函數(...)使用(&$結果){/ *修改$ results * /}' – cHao

2

您可以使用array_filter過濾出符合條件的元素,然後使用數組蘭特選擇選擇一個隨機的。

$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

相關問題