Ben korkunç bir döngü yaptı ...

3 Cevap php

Ben bu kötü bir şekilde yapıyorum biliyorum ... ama herhangi alternatifler gördükten sorun yaşıyorum. Ben rastgele 4. seçmek gerekir ürünlerin bir dizi var. $ RawUpsellList kendi arabası öğelerin kapalı tabanlı olası upsells her bir dizidir. Her bir değer, ürün amacıdır. Ben bu korkunç çirkin kod olduğunu biliyorum ama ben bu yüzden bu kod üretim yapmaz birisi benim sefalet beni koyun lütfen .... şimdi bir alternatif görmüyorum .....

$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;
    }
}

Bu kodu gönderdiği son derece utanç verici oldu ...

3 Cevap

Aslında, bir diziden rastgele çekerek çatlamak için zor bir somun - even Microsoft had trouble recently. Ben algoritmaları bir uzman olduğunu varsayalım birisi için iyi bir örnek kod, ama aynı zamanda istatistiksel çarpık olabilir. Dediğim gibi, bu hakkın yapmak zor.

Neyse ki, PHP zaten ne istediğinizi yapmak gibi görünüyor fonksiyonunu array_rand var iade N öğeler rasgele bir diziden seçilmiş. Eğer bu sizin için ne arıyorsanız?

$upsellList = array_rand($rawUpsellList, 4);

Gerçekten PHP içine değilim, ama bir algoritma olarak ben bu pseudocode veya ne olursa olsun dikkate alacaktır:

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