I know I'm doing this a bad way... but I'm having trouble seeing any alternatives. I have an array of products that I need to select 4 of randomly. $rawUpsellList is an array of all of the possible upsells based off of the items in their cart. Each value is a product object. I know this is horribly ugly code but I don't see an alternative now.... someone please put me out of my misery so this code doesn't make it to production.....

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

Posting this code was highly embarassing...

Accepted Answer

Actually, pulling randomly from an array is a tough nut to crack - even Microsoft had trouble recently. That's a decent code sample for someone who I assume isn't an expert in algorithms, but also may be statistically skewed. As I said, it's difficult to do this right.

Thankfully, PHP already has the function array_rand, which seems to do what you want: return N items randomly chosen from an array. Is that what you're looking for?

$upsellList = array_rand($rawUpsellList, 4);
Written by Matchu
This page was build to provide you fast access to the question and the direct accepted answer.
The content is written by members of the stackoverflow.com community.
It is licensed under cc-wiki