foreach($ item)按类别限制数量

时间:2013-02-04 19:04:39

标签: php foreach limit

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

  <?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个项目然后随机播放它们?

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

谢谢:)

3 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是在重新启动并随机播放之前获取每个项目中的5个。

答案 1 :(得分: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很难阅读和维护。

答案 2 :(得分:0)

用于代替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>
    <?
}   

?>