0

我正在尝试限制投资组合脚本中的项目数量。

  <?php
    $k = 1;     
    shuffle($items);
    foreach ($items as $item ){ 
    if($k==11) break; ?>
    <li data-id="id-<?php echo($k);  ?>" data-type="<?php echo( ereg_replace("[^A-Za-z0-9]", "", $item->item_category) ); ?>">
    ..........more item listings ....
    </li>
    <?php $k++; }   ?>

我在代码中添加了 shuffle,所以我可以从不同的类别中得到不同的结果,并且我可以限制结果的总数。但是我怎么能限制每个类别的项目数量呢?就像从每个类别中获取 5 个项目然后将它们洗牌?

我无法更改整体功能,因为它是插件的一部分。然而,添加到代码中的一些更改是可能的。有任何想法吗?

谢谢 :)

4

3 回答 3

0

最好的方法是在重新组合和洗牌之前获取每个项目的 5 个。

于 2013-02-04T19:17:46.440 回答
0

如果您不能限制传入数据中每个类别的项目数,那么您需要一个数据结构来在输入时对它们进行计数:

<?php
$k = 1;
$max_per_category = 5;
$cat_tracker = array();

shuffle($items);

foreach ($items as $item ){ 
    if( $k >= 11 ) {
        break;
    }

    if( ! isset($cat_tracker[$item->item_category]) ) {
        $cat_tracker[$item->item_category] = 1;
    } else if( $cat_tracker[$item->item_category] >= $max_per_category ) {
        continue;
    } else {
        $cat_tracker[$item->item_category]++;
    }

    $frame = '<li data-id="id-%d" data-type="%s">';
    printf($frame, $k, ereg_replace("[^A-Za-z0-9]", "", $item->item_category));
    // more item listings?
    printf('</li>');

    $k++;
}

我还用更干净的东西替换了你的输出代码。像这样进出 PHP 很难阅读和维护。

于 2013-02-04T19:19:58.980 回答
0

使用 for 而不是 foreach

<?php
    $values = shuffle($items);
    for ($k=0 ;$items[k] && $k<11;$k++ ){ 
    >
    <li data-id="id-<?php echo($k);  ?>" data-type="<?php echo( ereg_replace("[^A-Za-z0-9]", "", $items[$k]->item_category) ); ?>">
    ..........more item listings ....
    </li>
    <?
}   

?>
于 2013-02-04T19:37:32.060 回答