Silverstripe merge 2 pagetypes into alternating list

31 Views Asked by At

I'm trying to merge 2 pagetypes into a single SSList where the classes alternate, ie something like this:

$news = BlogPost::get()->sort('PublishedDate');
$projects = ProjectPage::get();

result should be a list where the pagetypes alternate:

BlogPost | ProjectPage | BlogPost | ProjectPage etc...

Any ideas would be appreciated!

1

There are 1 best solutions below

0
galilee On

Got this solved via some ideas from ChatGPT - may not be the best way, but seems to work, and accounts for uneven sets:

    $set1 = BlogPost::get()->limit(3);
    $set2 = ProjectPage::get()->limit(3);

    $mergedSet = ArrayList::create();

    $iterator1 = $set1->getIterator();
    $iterator2 = $set2->getIterator();

    while ($iterator1->valid() || $iterator2->valid()) {
        if ($iterator1->valid()) {
            $mergedSet->push($iterator1->current());
            $iterator1->next();
        }
        if ($iterator2->valid()) {
            $mergedSet->push($iterator2->current());
            $iterator2->next();
        }
    }

    return $mergedSet;