Сайт Романа ПарпалакаБлог

PHP: навигация

4 августа 2008 года, 23:57

Некоторое время назад Илья Бирман написал про подсветку ключевых слов. В комментариях после моего замечания о возможности использовать функцию preg_replace развязалась небольшая дискуссия о том, как правильно нужно генерировать подобные вещи. Вот что писал Илья:

*_replace — это вообще не наш метод, надо сразу всё правильно генерировать, а не резать по живому потом.

А генерировать неправильный контент, чтобы потом его героически исправить — это левак, нужно сразу генерировать правильный.

Рассмотрим достоинства и недостатки различных подходов к генерации контента на простом примере навигационных ссылок.

Использование preg_replace позволяет сделать код коротким и понятным.

$cur_url = 'item2.htm';

$menu = '<a href="item1.htm">item1</a><br />
<a href="item2.htm">item2</a><br />
<a href="item3.htm">item3</a><br />
<a href="item4.htm">item4</a><br />
<a href="item5.htm">item5</a>';

$menu = preg_replace(
	'#<a href="'.$cur_url.'">([^<]*)</a>#',
	'<span>\\1</span>',
	$menu);

Однако на мой взгляд этот код может быть расценен в соответствии с цитатой как «левак». Я не знаю, какой способ является правильным в этой ситуации с точки зрения Ильи, но могу предположить, что он должен быть примерно таким:

$cur_url = 'item2.htm';

$menu_array = array(
	'item1.htm' => 'item1',
	'item2.htm' => 'item2',
	'item3.htm' => 'item3',
	'item4.htm' => 'item4',
	'item5.htm' => 'item5'
);

$menu = '';
foreach ($menu_array as $url => $link) {
	if ($url != $cur_url)
		$menu .= '<a href="'.$url.'">'.$link.'</a><br />';
	else
		$menu .= '<span>'.$link.'</span><br />';
}

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

Можно применить и третий способ:

$cur_url = 'item2.htm';

if ($url != 'item1.htm')
	$menu = '<a href="item1.htm">item1</a><br />';
else
	$menu = '<span>item1</span><br />';

if ($url != 'item2.htm')
	$menu .= '<a href="item2.htm">item2</a><br />';
else
	$menu .= '<span>item2</span><br />';

if ($url != 'item3.htm')
	$menu .= '<a href="item3.htm">item3</a><br />';
else
	$menu .= '<span>item3</span><br />';

if ($url != 'item4.htm')
	$menu .= '<a href="item4.htm">item4</a><br />';
else
	$menu .= '<span>item4</span><br />';

if ($url != 'item5.htm')
	$menu .= '<a href="item5.htm">item5</a>';
else
	$menu .= '<span>item5</span>';

Он еще более громоздкий, да еще и избыточный. Хотя данный способ в полтора раза быстрее первого, в подобной ситуации я отдаю предпочтение использованию preg_replace.

    6 комментариев

Странности фотошопа

3 августа 2008 года, 20:22

Я постоянно спотыкаюсь в фотошопе на этом окне из-за нечеловеческого не принятого в Windows порядка кнопок.

    Оставить комментарий

Красота науки

1 августа 2008 года, 23:14

Советую почитать статью «Красота науки», когда-то давно опубликованную в журнале «Наука и жизнь». Она будет полезна тем, кто думает, что в науке не может быть никакой красоты.

    1 комментарий

Советская газировка

31 июля 2008 года, 20:03

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

Сегодня проходил мимо центрального рынка в Кишиневе и увидел вот что:

Случайная прохожая загораживает именно советский аппарат с газированной водой! Я просто не мог не попробовать эту газировку с сиропом и не освежить воспоминания.

Как следовало ожидать, цена оказалась в 10 раз меньше, чем у Лебедева.

    3 комментария

Противогазы

26 июля 2008 года, 01:29

В аську спам пришел.

414241167 (01:20:25 26/07/2008)
АППЕТИТНАЯ БЛОНДИНКА
воплотит ваши фантазии по телефону
звони: ******
стоимость 95 р/мин 18+

_________
Если вам мешает спам, поставьте антиспам-фильтр.

«Если вам мешает дым от сигарет, ходите в противогазах», ага.

    Оставить комментарий

PHP и timestamp

24 июля 2008 года, 18:18

На мой взгляд, функции time(), mktime(), date(), gmmktime(), gmdate() недостаточно хорошо описаны в документации. Легко запутаться при попытках понять, что же происходит в разных часовых поясах. Вот доходчивое объяснение (правда, на английском). Вкратце его суть в следующем. Метка времени (timestamp) фиксированного момента одна и та же для всех часовых поясов. Функции date() и mktime() преобразуют timestamp ко времени в часовом поясе, установленном на сервере, и обратно. Функции gmdate() и gmmktime() делают то же самое, но только для гринвичского времени.

    Оставить комментарий

С трехлетием, written.ru!

20 июля 2008 года, 16:57

Да, это так. Как быстро летит время! Три года назад written.ru появился на просторах Интернета. Написал по этому поводу праздничную заметку номер 75.

Поздравления можно оставлять в комментариях.

    1 комментарий
Смотрите также:  Cайту 20 лет · Сайту 10 лет · Сайту шесть лет · Сайту пять лет · written.ru четыре года · У сайта день рождения · Сайту written.ru — год

Деньги

18 июля 2008 года, 17:59

Почти всё делают деньги, почти все делают деньги.

    Оставить комментарий

Новые изобретения

17 июля 2008 года, 11:39

Граф Ван де Граафа.
Поле Ван-дер-Поля.
Вальс Ван-дер-Ваальса.

    Оставить комментарий

Картинка

15 июля 2008 года, 11:03
— Ты лучше назови источник картинки.
— майкрософт офис
— Тебе из офиса Microsoft картинку прислали?
    Оставить комментарий

← сюда туда →

Поделиться
Записи