Самый легкий способ чередовать строку раскрашивает PHP/HTML?

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

var assert = require('assert')
var Promise = require('bluebird')

/* global describe, it*/

var fn = function(value) {
  return value + ' ' + 'pancake'
}

function getTests() {
  return Promise.resolve('kitty pancake')
    .delay(500)
    .then(function(value) {
      return [
        {
          'arg': 'kitty',
          'expect': value
        },
        {
          'arg': 'doggy',
          'expect': 'doggy pancake'
        }
      ]
    })
}

describe('example', function() {
  it('should handle many things', function(done) {
    getTests().then(function(tests) {
      tests.forEach(function(test) {
        var value = fn(test.arg)
        assert.equal(value, test.expect, 'should return ' + test.expect)
      })
      done()
    })
  })
})
26
задан dreftymac 7 February 2009 в 00:28
поделиться

14 ответов

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

$c = true; // Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
    echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
46
ответ дан Vilx- 15 October 2019 в 06:52
поделиться

Если Вы хотите сделать это на дисплее, заканчиваются и довольны или иначе уже использование JavaScript, библиотеки как jQuery будут часто иметь : нечетный и : даже селекторы, которые можно тогда сцепить до добавления конкретного свойства стиля или сцепление в CSS в более общем плане добавляющие классы .

1
ответ дан Glazius 15 October 2019 в 06:52
поделиться

Использование чего-то вроде этого:

<?php
function cycle(&$arr) {
    $arr[] = array_shift($arr);
    return end($arr); 
}

$oddEven = array('odd', 'even');
echo cycle($oddEven)."\n";
echo cycle($oddEven)."\n";
echo cycle($oddEven)."\n";
0
ответ дан 15 October 2019 в 06:52
поделиться

Только для забавы

Принятие можно использовать селекторы CSS3, можно сделать что-то как

<div class="posts">
<? foreach($posts as $post){?>
    <div>
        <?=$post?>
    </div>
<? }?>
</div>

<style>
    div.posts div:odd{background-color:red;}
</style>

Даже с поддержкой CSS2 и mootools (библиотека JavaScript), можно заменить стилем с этим javascript

<script type="text/javascript">
    // obviously this script line should go in a js file in a onload (or onDomReady) function
    $('div.posts div:odd').setStyle('background-color','red');
</script>

, Если у Вас ничего нет кроме php этим, можно упростить немного Ваш код с помощью массива

<? $isodd=array('','odd');
   $c=0;
   foreach($posts as $post){?>
    <div class="<?=$isodd[$c++%2]?>">
        <?=$post?>
    </div>
<? }?>
2
ответ дан Eineki 15 October 2019 в 06:52
поделиться

На стороне noe, для чередования между двумя значениями и b хороший способ сделать его в цикле является этим:

x = a;
while ( true ) {
    x = a + b - x;
}

можно также сделать это без дополнения и вычитания:

x = a ^ b ^ x;

, где ^ является операцией "исключающее ИЛИ".

, Если Вы просто хотите чередоваться между 0 и 1, можно сделать это:

x = 0;
while ( true ) {
    x = !x;
}

Вы могли, конечно, использовать x как индекс цветов, классы стиля CSS и так далее.

1
ответ дан csl 15 October 2019 в 06:52
поделиться

Можно инкапсулировать логику следующим образом:

<?php

class ListCycler {
    private $cols, $offs, $len;

    // expects two or more string parameters
    public function __construct() {
        $this->offs = -1;
        $this->len = func_num_args();
        $this->cols = func_get_args();

        foreach($this->cols as &$c)
            $c = trim(strval($c));
    }

    // the object auto-increments every time it is read
    public function __toString() {
        $this->offs = ($this->offs+1) % $this->len;
        return $this->cols[ $this->offs ];
    }
}
?>
<html>
<head>
  <style>
    ul#posts li.odd { background-color:red; }
    ul#posts li.even { background-color:white; }
  </style>
</head>
<body>
  <div>
    <h3>Posts:</h3>
    <ul id="posts"><?php
        $rc = new ListCycler('odd','even');
        foreach($posts as $p)
            echo "<li class='$rc'>$p</li>";
    ?></ul>
  </div>
</body>
</html>
2
ответ дан strager 15 October 2019 в 06:52
поделиться

У присяжного острослова есть он встроенный:

{section name=rows loop=$data}
<tr class="{cycle values="odd,even"}">
   <td>{$data[rows]}</td>
</tr>
{/section}

Так делает Django:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
8
ответ дан gak 15 October 2019 в 06:52
поделиться

Если требуется иметь меньше встроенного PHP, отличный способ выполнения, это через JavaScript.

Используя jQuery, это просто:

<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
19
ответ дан ThiefMaster 15 October 2019 в 06:52
поделиться

Используя CSS3 можно сделать что-то вроде этого:

div:nth-child(odd)
{
  background-color: red
}

, Но лучше не используют это в течение нескольких лет, если Вы на самом деле хотите, чтобы Ваши пользователи видели цвет...

11
ответ дан Ole Helgesen 15 October 2019 в 06:52
поделиться

Возможно, функция со статической переменной?

<?php

function alternate_row_color($css_class) {
    static $show = true;

    $show = !$show;

    if ($show) {
        return $css_class;
    } else {
        return NULL;
    }
}

?>

Затем для использования его (использование примера):

<?php foreach($posts as $post) { ?>
    <div class="<?=alternate_row_color('odd')?>">
        <?=$post?>
    </div>
<?php } ?>
3
ответ дан Jeremy Ruten 15 October 2019 в 06:52
поделиться
<?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?>
<div<?php echo $alt ? ' class="odd"' : ''; ?>>
    <!-- Content --> 
</div>  
<?php endforeach ?>

был бы самый простой и самый ясный способ сделать это.

2
ответ дан navitronic 15 October 2019 в 06:52
поделиться

я всегда называю свои строки зебры "row0" и "row1" - это делает код немного более простым.

<?php  // you should always use the full opening tag for compatibility
$i = 0;
foreach ($rows as $row) {
    echo '<tr class="row' . ($i++ % 2) . '">...</tr>';
} 
?>
5
ответ дан nickf 15 October 2019 в 06:52
поделиться

Это достаточно коротко, как это, но я, вероятно, перенесся бы, это в некоторого помощника функционирует с ясным именем. Тем путем более очевидно, что продолжается, и Вы не должны будете повторять, что логика во всех шаблонах, где Вам нужен он.

1
ответ дан PEZ 15 October 2019 в 06:52
поделиться
function row_color($cnt,$even,$odd) { 
echo ($cnt%2) ? "<tr bgcolor=\"$odd\">" : "<tr bgcolor=\"$even\">"; 
} 

Как использовать:

$cnt=0;
while ($row = mysql_fetch_array ($result)) {
row_color($cnt++,"e0e0e0","FFFFFF");
}
1
ответ дан 28 November 2019 в 06:04
поделиться