2017-03-29 61 views
5

我知道,我们可以随机排序以下配置的DataList的ArrayList的()SilverStripe随机顺序

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

但是当我尝试随机排序的ArrayList这是行不通的。我可以通过ID DESC排序ArrayList,但不能与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 %>

回答

4

没有真正的工作。这是我能拿出最好的解决方法:

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

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

这不像我预期的那样,但它足够高效,不会产生重复的代码。我会尽快尝试。谢谢! – StefGuev

+0

我在早上测试了这个...完美的工作。谢谢 – StefGuev

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,涉及到这个MemberIDVersioned::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

+0

'filter'的最后一种方法绝对是最干净和最有效的方法。 – bummzack