比较PHP foreach项和增量

时间:2014-07-02 17:20:31

标签: php codeigniter loops foreach

我使用codeigniter来构建组织办公室用户的表,根据某人使用办公室的次数。因此,该表将包括用户名,使用次数以及使用办公室次数最多(使用次数最多)的用户位于顶部的排名/位置。就像游戏排行榜一样,得分最高的用户位居榜首。

我有这段代码:

<?php $i=1;?>
<?php foreach ($leaders as $item):?>
    <?php if($i==11) break; ?>
<tr>
    <td><?= $i++; ?></td>
    <td><?= $item['Name']; ?></td>
    <td><?= $item['Uses']; ?></td>
</tr>
<?php endforeach;?>

此代码列出了从最高到最低使用率最高的用户。 显示前10名。

但是,如果一个以上的用户具有相同的使用次数,则表格上的位置会有所不同,因为我会为循环中的每个项目增加位置$ i。

我尝试了这段代码,但它并不像我想要的那样完成。

<?php
$i=1;
$uses=null;
?>
<? foreach ($leaders as $item): 
    if($i==11) break; 

    if ($uses== $item['Uses']) {
        $i=$i;
    } else {
        $i=$i++;
    }
?>
<tr>
    <td><?= $i; ?></td>
    <td><?= $item['Name']; ?></td>
    <td><?= $item['Uses']; ?></td>
</tr>
<?= $uses=$item['Uses']; ?>
<?php endforeach;?>

如何解决此问题,以便具有相同使用次数的用户显示在同一位置。例如,John,Mary和Carl都有5个用途,他们都应该有位置2($i),而不是2,3,4。

因此,具有相同使用次数$item['Uses'];的所有用户具有相同的位置$i

编辑

尝试实现这样的目标:

$previous_value = 0;
foreach ($arr as $key=>$value) {
    echo $key .'=>'. $previous_value .' '.  $value;
    $previous_value = $value;
}

我基本上想说,如果使用==之前的项目使用,则$ i与循环中prev项目中的$ i相同,否则,$ i ++

2 个答案:

答案 0 :(得分:1)

好吧,假设你已经订购了用户,你的foreach中应该只有10个(尝试在SQL查询中使用限制10,或从数组中提取它们),并且你可以避免使用中断在里面。没关系,你的问题是如何处理重复的用户。您只需要检查以前的值是否重复。如果没有,增加并继续前进。下面你有一个带循环的PHP文件,是一个独立的文件,你可以复制粘贴并运行它,你就会有你的列表:

<?php
$users = array(
    array('name'  => 'user1',   'uses'  => 30)
,   array('name'  => 'user2',   'uses'  => 30)
,   array('name'  => 'user3',   'uses'  => 22)
,   array('name'  => 'user4',   'uses'  => 20)
,   array('name'  => 'user5',   'uses'  => 16)
,   array('name'  => 'user6',   'uses'  => 16)
,   array('name'  => 'user7',   'uses'  => 15)
,   array('name'  => 'user8',   'uses'  => 10)
);

$position  = 1;    
$prev_uses = $users[0]['uses'];
foreach ( $users as $user ) {
    if ( $prev_uses != $user['uses'] ) {
        $position++;
    }
    echo $position . ' - Name: ' . $user['name'] . ' Values: ' . $user['uses'] . '<br>';
    $prev_uses  = $user['uses'];
}

最重要的是初始值,如您所见,我使用第一个用户的值在$prev_uses初始化它。

如果您确实需要使用休息时间(我建议您不要使用它来避免不必要的检查),修改将是:

$position   = 1; 
$user_count = 1;   
$prev_uses  = $users[0]['uses'];
foreach ( $users as $user ) {
    if ( $user_count == 11 ) {
        break;
    } else {
        $user_count++;
    }
    if ( $prev_uses != $user['uses'] ) {
        $position++;
    }
    echo $position . ' - Name: ' . $user['name'] . ' Values: ' . $user['uses'] . '<br>';
    $prev_uses  = $user['uses'];
}

如你所见,你需要两个变量才能继续计算,XD

答案 1 :(得分:0)

假设您的阵列已按使用顺序排列。您可以替换此行:

首先这样做:

<?php 
    $uses = array('','');
    foreach ($leaders as $item):?>
<?= $uses=$item['Uses']; ?>

通过

<?php $uses=array($i,$item['Uses']); ?>

所以你可以这样做:

<?php
if ($uses[1] == $item['Uses']){
$i=$uses[0];
else{
$i=$i++;
}
?>