#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. Это дало мне тот же результат. Я отредактировал некоторые операции, чтобы показать, чего я пытаюсь достичь