【问题标题】:SilverStripe random order for ArrayList()ArrayList() 的 SilverStripe 随机顺序
【发布时间】:2017-08-23 12:51:47
【问题描述】:

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

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

但是当我尝试对ArrayList 进行随机排序时,它不起作用。我可以通过ID DESCArrayList 进行排序,但不能使用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 %> 的模板

【问题讨论】:

    标签: php arraylist silverstripe


    【解决方案1】:

    不是真的。这是我能想到的最佳解决方法:

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

    【讨论】:

    • 这不像我预期的那样,但它的效率足以避免重复代码。我很快就会试试这个。谢谢!
    • 我早上测试了这个......效果很好。谢谢
    【解决方案2】:

    您可以在循环之前对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 以在 Versioned::get_by_stage 调用中获取与此 MemberID 相关的 KitsPages

    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

    【讨论】:

    • 最后一种使用filter 的方法绝对是最干净也是最有效的方法。
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2020-03-20
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多