ArrayList()的SilverStripe随机顺序

时间:2017-03-29 20:31:54

标签: php arraylist silverstripe

我知道我们可以使用以下内容随机对DataList进行排序:

$example = Example::get()->sort('RAND()');

但是当我尝试随机排序ArrayList时,它不起作用。我可以按ArrayList排序ID DESC,但RAND()不能排序。

有没有办法让ArrayList随机对其项目进行排序?

示例:

public function AllTheKits() {
    $kits = Versioned::get_by_stage('KitsPage', 'Live');
    $kitsArrayList = ArrayList::create();

    foreach ($kits as $kit) {
        if ($kit->MemberID == Member::currentUserID()) {
            $kitsArrayList->push($kit);
        }
    }
    return $kitsArrayList;      
}

在页面中:

public function getKitsRandom() {
    return $this->AllTheKits()->sort('RAND()');
}

这在<% loop KitsRandom %>

的模板中不起作用

2 个答案:

答案 0 :(得分:4)

不是真的。这是我能提出的最好的解决方法:

foreach($myArrayList as $item) {
    $item->__Sort = mt_rand();
}

$myArrayList = $myArrayList->sort('__Sort');

答案 1 :(得分:3)

您可以在循环前对DataList进行随机排序,而不是尝试对ArrayList进行随机排序:

public function AllTheKits($sort = '') {
    $kits = Versioned::get_by_stage('KitsPage', 'Live', '', $sort);
    $kitsArrayList = ArrayList::create();

    foreach ($kits as $kit) {
        if ($kit->MemberID == Member::currentUserID()) {
            $kitsArrayList->push($kit);
        }
    }
    return $kitsArrayList;      
}

public function getKitsRandom() {
    return $this->AllTheKits('RAND()'));
}

作为旁注,您可以过滤原始DataList,以便在KitsPages调用中获取与此MemberID相关的Versioned::get_by_stage

public function AllTheKits($sort = '') {
    $kits = Versioned::get_by_stage(
        'KitsPage',
        'Live',
        'MemberID = ' . Member::currentUserID(),
        $sort
    );
    $kitsArrayList = ArrayList::create($kits);

    return $kitsArrayList;      
}

您也可以这样做:

return KitsPage::get()->filter('MemberID', Member::currentUserID())->sort('RAND()');

当您查看实际网站时,这只会获得实时KitPages