2010-04-13 61 views
4

我知道我這樣做是個不錯的方法......但我無法看到任何的替代品。我有一系列需要隨機選擇4個的產品。 $ rawUpsellList是基於購物車中物品的所有可能的加售的數組。每個值都是一個產品對象。我知道這是可怕的醜陋的代碼,但我沒有看到另一種現在....有人請把我從我的痛苦所以這個代碼不使其向生產.....我犯了一個可怕的循環....幫助解決我的邏輯,請

$rawUpsellList = array(); 
foreach ($tru->global->cart->getItemList() as $item) { 
    $product = $item->getProduct(); 

    $rawUpsellList = array_merge($rawUpsellList, $product->getUpsellList()); 
} 

$upsellCount = count($rawUpsellList); 

$showItems = 4; 
if ($upsellCount < $showItems) { 
    $showItems = $upsellCount; 
} 

$maxLoop = 20; 
$upsellList = array(); 
for ($x = 0; $x <= $showItems; $x++) { 
    $key = rand(0, $upsellCount); 
    if (!array_key_exists($key, $upsellList) && is_object($rawUpsellList[$key])) { 
     $upsellList[$key] = $rawUpsellList[$key];   
     $x++; 
    } 

    if ($x == $maxLoop) { 
     break; 
    } 
} 

發佈這個代碼是高度尷尬...

回答

6

實際上,從數組隨機拉動是一個艱難的疙瘩 - even Microsoft had trouble recently。對於我認爲不是算法專家的人來說,這是一個不錯的代碼示例,但也可能會出現統計偏差。正如我所說,做這件事很困難。

值得慶幸的是,PHP已經具有的功能array_rand,這似乎做你想要的:返回N項隨機從數組中選擇。那是你在找什麼?

1

array_rand將允許您從數組中隨機選取一個或多個元素。

要使用它(並保存自己很多頭痛的),只是這樣做

 
$upsellList = array_rand($rawUpsellList, 4); 
2

我沒有真正進入PHP,但作爲一個算法,我會考慮這個僞代碼或什麼:

List<WhateverTypeYouWant> array; 
List<WhateverTypeYouWant> selectedElements; 

for (int i = 1; i <= 4; i++) 
{ 
    int randomIndex = random(array.size()); 
    selectedElements.add(array[randomIndex]); 
    array.remove(randomIndex); 
} 
+2

這是[Fisher-Yates shuffle]的基本實現(http://en.wikipedia.org/wiki/Fisher-Yates_shuffle):) – Matchu 2010-04-13 18:26:51

+0

哈,謝謝:)我不知道它有一個名字,雖然我已經使用過很多次了。 – 2010-04-13 18:28:24

+0

...我也只是注意到Markdown以某種方式破壞了URL。 http://en.wikipedia.org/wiki/Fisher-Yates_shuffle – Matchu 2010-04-13 18:33:18