Используйте PHP для отображения каждой n-й строки из mysqli_fetch_array, в то время как loop [duplicate]

Ну, причина в том, что привязки выполняются при выполнении кода, и выполняется определение функции, ну ... когда функции определены.

Сравните это:

class BananaBunch:
    bananas = []

    def addBanana(self, banana):
        self.bananas.append(banana)

Этот код страдает от такого же неожиданного случая. bananas - это атрибут класса, и, следовательно, когда вы добавляете к нему вещи, он добавляется ко всем экземплярам этого класса. Причина в том, что это точно то же самое.

Это просто «Как это работает», и заставить его работать по-другому в функциональном случае, вероятно, будет сложно, а в случае класса вероятно невозможно или, по крайней мере, замедлить объект создание экземпляра, так как вам придется хранить код класса и выполнять его при создании объектов.

Да, это неожиданно. Но как только пенни падает, она прекрасно вписывается в то, как работает Python в целом. На самом деле, это хорошее учебное пособие, и как только вы поймете, почему это происходит, вы будете намного лучше читать python.

Это говорит о том, что он должен занимать видное место в любом хорошем учебнике Python. Потому что, как вы говорите, все рано или поздно сталкиваются с этой проблемой.

1
задан carlgcode 9 September 2011 в 11:04
поделиться

4 ответа

Вы можете использовать логический флаг для отслеживания - это нечетная или четная строка, то есть

$isOdd = true;
while(...){
  if($isOdd) echo '<li style="background: #222;"></li>';
  else echo '<li></li>';
  $isOdd = ! $isOdd;
}
1
ответ дан ain 21 August 2018 в 13:30
поделиться
  • 1
  • 2
    Ну, это действительно просто - $isOdd - логическая переменная, инициализированная true, а в конце цикла вы переключаете ее значение между true и false (инструкция $isOdd = ! $isOdd;, она читает $isOdd = not $isOdd т.е. он циклически меняется между истинным и ложным). – ain 9 September 2011 в 11:23
  • 3
    спасибо, помогло мне много – carlgcode 9 September 2011 в 11:27

Или еще лучше

$isOdd = true;
while(...){
  echo '<li class="' . ($isodd ? 'odd' : 'even'). '"></li>
  $isOdd = ! $isOdd;
}

Затем поместите цвета в таблицу стилей - у этого есть преимущество, вы можете даже изменить шрифты и т. д. Вы даже можете придать ему новый вид, не меняя код

3
ответ дан Ed Heal 21 August 2018 в 13:30
поделиться
  • 1
    Очень приятно :) не думал об этом;) – carlgcode 9 September 2011 в 11:19
  • 2
    Если вы умны - есть CSS в кармане - вы можете получить повышение в 6 тыс. – Ed Heal 9 September 2011 в 21:39

Вы можете сделать что-то вроде следующего:

$colors = array('111', '222');
$i = 0;
while (...) {
    echo '<li style="background: #' . $colors[$i % count($colors)] . '"></li>';
    $i++;
}

Для аккуратности вы также можете превратить петлю while в цикл for. Например:

$colors = array('111', '222');
for ($i = 0; ...; $i++) {
    echo '<li style="background: #' . $colors[$i % count($colors)] . '"></li>';
}
0
ответ дан moteutsch 21 August 2018 в 13:30
поделиться

Вы хотите, чтобы все четные значения отображали что-то еще; это будет делать это с помощью оператора modulo:

$index = 0;
while($user = $q->fetch(PDO::FETCH_ASSOC))
{
   if(++$index%2 == 0) //is index +1 even?
     echo '<li style="background: #222;"></li>';
   else
     echo '<li></li>';
}

Если возможно, вы можете перейти в цикл for, так как вы уже определили свой $index.

3
ответ дан TJHeuvel 21 August 2018 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: