Альтернативные цвета линии - понимание предоставленного кода - PullRequest
0 голосов
/ 09 февраля 2011

В примере, подобном этому :

$c = true; // Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
    echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";

Я бы хотел понять, как это работает.

Что мы пытаемся сделать с этим примером? Есть ли альтернативная строка div, изменяя true на false и false на true?

Ответы [ 5 ]

3 голосов
/ 09 февраля 2011

Да.

$c = !$c присваивает себе противоположное значение $c. Затем переменная оценивается после присвоения.

Это приводит к постоянно меняющемуся значению между true и false.

Этот код использует петлю foreach. Если у вас есть нормальный цикл for, вы можете использовать вместо него переменную counter:

for($i = 0, $l = count($posts); $i < $l; $i++) {
    echo '<div'.(($i % 2)?' class="odd"':'').">{$posts[$i]}</div>";
}
2 голосов
/ 09 февраля 2011

Если вы присваиваете значимые имена своим переменным и щедро используете пробелы, код обычно легче понять:

1 голос
/ 09 февраля 2011

Назначения в PHP возвращают вновь присвоенное значение. Таким образом, $c = !$c возвращает true, когда $c было false; false когда $c было true.

Тернарный оператор (?:) Оценивает деталь перед ':', когда условие до '? верно, в противном случае часть после ':'. Таким образом, он выводит текст до или после ':'.

Как говорили другие, вероятно, лучше написать это более понятным способом.

1 голос
/ 09 февраля 2011

Да.

$c = true;
$not_c = !$c; // $not_c is now false
$c = !$c;     // same as above, but assigning the result to $c. So $c is now false
$c = !$c;     // $c is now true again

Предоставленный вами фрагмент можно переписать (и, возможно, сделать более понятным) следующим образом:

$c = true;
foreach ($posts as $post) {
    $c = !$c;
    echo '<div' . ($c ? ' class="odd"' : '') . ">$post</div>";
}

Синтаксис $c ? ... : ... использует троичный оператор. Это что-то вроде краткого заявления if. Например, true ? "a" : "b" оценивается как "a".

1 голос
/ 09 февраля 2011

Здесь очень короткая хитрость.Вы можете разбить внутреннюю часть цикла на три строки:

$c = !$c; // invert c
$class_part = $c ? ' class="odd"':''; // if c is true, class is odd.
echo "<div$class_part>$post</div>"; // print the <div> with or without the class
                                    // depending on the iteration
...