Сравнить PHP для каждого элемента и увеличить

#php #codeigniter #loops #foreach

#php #codeigniter #циклы #для каждого

Вопрос:

Я использую codeigniter для построения таблицы, упорядочивающей пользователей office, в соответствии с тем, сколько раз кто-то использует office. Таким образом, таблица будет включать имя пользователя, количество использований и ранг / должность, где пользователь, который использовал office наибольшее количество раз (имеет наибольшее количество использований), находится наверху. Похоже на таблицу лидеров игры, где пользователь с наибольшим количеством баллов находится на вершине.

У меня есть этот код:

 <?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;?>
  

Как мне исправить это, чтобы пользователи с одинаковым количеством использований отображались в одной и той же позиции. Например, если у Джона, Мэри и Карла всего 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 совпадает с $ i в предыдущем элементе в цикле, иначе, $ i

Комментарии:

1. » Он показывает 10 лучших «, только если массив уже отсортирован по uses .

2. Мне нравится ваше первое предложение… «Я подаю в суд на codeigniter» 🙂

3. Почему у вас есть $i=$i; ?

4. Вам не нужно делать <? ... ?> для КАЖДОЙ строки php-кода. если у вас есть несколько строк php-кода, затем откройте тег ОДИН РАЗ, введите свои несколько строк, затем закройте его.

5. @dave Я пытался понять, что если использование для предыдущих пользователей такое же, как у этого пользователя, то позиция i должна быть такой же, иначе увеличьте ее на единицу.

Ответ №1:

Ну, допустим, вы упорядочили своих пользователей, у вас должно быть только 10 в вашем foreach (попробуйте использовать ограничение 10 в вашем SQL-запросе или извлечь их из массива), и вам не пришлось бы использовать разрыв внутри него. Неважно, ваша проблема в том, что делать с тем, что пользователи повторяются. Вам нужно будет только проверить, повторяется ли предыдущее значение. Если нет, увеличьте и продолжайте. Ниже у вас есть 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 значением первого пользователя.

Если вам действительно нужно использовать break (я предлагаю вам не использовать его, чтобы избежать ненужных проверок), модификация будет:

 $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

Ответ №2:

Предполагая, что ваш массив уже упорядочен по uses. Вы можете заменить эту строку:

Сначала сделайте это:

 <?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  ;
}
?>
  

Комментарии:

1. Это дало мне тот же результат. Я отредактировал некоторые операции, чтобы показать, чего я пытаюсь достичь