2010-10-06 4 views
0
echo '<a href="?view=new&days=2">2</a> • <a href="?view=new&days=4">4</a> • <a href="?view=new&days=7">7</a> • <a href="?view=new&days=14">14</a> • <a href="?view=new&days=30">30</a> days'; 

У меня это как «подменю», для отображения новейших членов. Вы можете выбрать, сколько дней вы хотите увидеть самых новых пользователей на сайте.

Его много повторяющееся, единственное, что меняется, - это дни = 30 в ссылке и «30» в качестве ссылочного текста.

Теперь я хотел бы проверить, есть ли $ _GET ["days"] == 2, затем выделено жирным шрифтом, <strong>2</strong>.

Я мог бы сделать это сам, но тогда это будет просто дублирование всего, и в каждой ссылке сделайте $ _GET ["days"] == 1, $ _GET ["days"] == 2, $ _GET ["days"] == 3 ..

Разве нет более разумного способа сделать это, не повторяясь все время?

ответ

4

Вы можете сделать это:

$days = isset($_GET['days']) ? $_GET['days'] : 2; 
$daysArray = array(2, 4, 7, 14, 30); 
foreach ($daysArray as &$val) { 
    if ($days == $val) { 
     $val = '<a href="?view=new&amp;days='.$val.'"><strong>'.$val.'</strong></a></b>'; 
    } else { 
     $val = '<a href="?view=new&amp;days='.$val.'">'.$val.'</a>'; 
    } 
} 
echo implode(' • ', $daysArray); 

Здесь conditional operator cond ? expr1 : expr2 используется для назначения либо значение $_GET['days'] или 2 к $days в зависимости от того, isset($_GET['days']) является истинным или ложным. С использованием &$val в foreach, $val является ссылкой на фактическое значение в $daysArray, так что изменение $val внутри foreach также изменит значение, которое оно ссылается в $daysArray. Это означает, что после цикла foreach$daysArray представляет собой массив ссылок, которые затем объединяются с использованием  •  в качестве разделителя.

Это может быть не самое сжатое решение, но оно соответствует требованию. Как другие уже упоминались, вы можете рассмотреть возможность использования маркированного списка, а и отобразить его в виде списка одной линии с пулевыми сепараторами с помощью CSS вместо:

ul { 
    margin: 0; 
    padding: 0; 
} 
ul > li { 
    list-style-type: none; 
    float: left; 
} 
ul > li + li:before { 
    content: '•'; 
    margin: 0 0.35em; 
} 

На самом деле, я бы предпочел, чтобы тоже.

+0

+1 за то, что не забыл про • :) –

+0

Хорошее решение. У меня мало вопросов только для того, чтобы расширить свои знания. Что вы делаете за несколько дней? Логическое? и почему: 2; ? и foreach у вас есть $ daysArray as & $ val <- Что это значит? – Johnson

+0

Элементы '?' И ':' вместе образуют условный оператор. Он разбивает утверждение на три части: условие, значение, если условие истинно, и значение, если оно ложно. – cHao

0

С массивом?

$days = isset($_GET['days']) ? intval($_GET['days']) : 2; 

foreach(array(2,4,7,14,30) as $day) { 
echo '<a href="?view=new&days='.$day.'">'.($day===$days ? '<strong>'.$day.'</strong>' : $day).'</a>'; 
} 
0

Я бы массив со всеми значениями:

$days = array(2, 4, 7, 14, 30); 

и создать список, как так:

<ul> 
<?php foreach($days as $day): ?> 
    <li> 
    <a href="?view=new&days=<?php echo $day ?>"> 
     <?php echo (isset($_GET['days']) && $_GET['days'] == $day) "<strong>$day</strong>" : $day; ?> 
    </a> 
    </li> 
<?php endforeach;?> 
</ul> 
+0

Хотя мне очень нравится этот подход, 'isset ($ _ GET ['days']) кажется очень неуместным в представлении. а также 'echo' –

+0

@Col: Помогите объяснить почему? –

+0

только потому, что это подготовка данных. Все данные должны быть готовы перед вызовом шаблона. Или вы испортите всю идею разделения логики бизнеса/презентации. –

0

сделать петлю:

$days = array(2, 4, 7, 30); 
foreach($days as $day){ 
    $label = $_GET['days'] == $day ? '<strong>'.$day.'</strong>' : $day; 
    echo '<a href="?view=new&days='.$day.'">'.$label.'</a>'; 
} 

Кроме того, вы должны использовать класс CSS вместо использования сильного тега:

$days = array(2, 4, 7, 30); 
foreach($days as $day){ 
    $attr = $_GET['days'] == $day ? ' class="active"' : ''; 
    echo '<a href="?view=new&days='.$day.'"'.$attr.'>'.$day.'</a>'; 
} 

CSS должно быть так:

<style type="text/css"> 
.active{ font-weight: bold} 
</style> 

Таким образом, вы позже сможете изменить внешний вид активной ссылки без изменения вашего PHP кода

0

здесь шахтные 5 центов.
все здесь говорят о MVC, но почти никто не использует его в своих примерах.

Сначала мы должны подготовить все необходимые данные.

<? 
$day_vars = array(2, 4, 7, 14, 30); 

if (!isset($_GET['days'])) $_GET['days'] = 2; 
$key = array_search($_GET['days'], $day_vars); 
$days = $day_vars[$key]; 
?> 

и затем выводятся при помощи шаблона
(частично основанный на хорошее предложение Бена)

<ul> 
<? foreach($day_vars as $day): ?> 
    <li> 
    <a href="?view=new&days=<?=$day?>"<? if($days == $day): ?> class="active"<? endif ?>> 
    <?=$day?> 
    </a> 
    </li> 
<? endforeach ?> 
</ul> 

, как и для • характер, все внешний вид должен быть сделан с помощью функции CSS.

Смежные вопросы