Навигационное меню

John2

Guest
Навигационное меню

Здравствуйте имею обычное меню с исключением ссылки на находящейся странице
PHP:
<?php
$navi = array (
'/saunas/building/' => 'ссылка 1', 
'/saunas/parnas/' => 'ссылка 2',
'/saunas/wellness/' => 'ссылка 3',
'/saunas/infrared/' => 'ссылка 4',
'/saunas/tylo/' => 'ссылка 5',
'/saunas/klafs/' => 'ссылка 6',
'/saunas/accessory/' => 'ссылка 7'
); 
foreach ($navi as $key => $value) { 
if ($REQUEST_URI=="$key") 
echo "<li><span id=\"active\">$value</span></li>"; 
else 
echo "<li><a href='$key'>$value</a></li>"; 
} 
?>
а как сделать такое же только с открывающимися подпунктами.
Что бы было понятнее имею ввиду именно такое меню
www.ancor.ru

Я так понимаю нужно ещё создавать массивы с пунктами для каждой ссылке меню. А вот с помощью какой функции и как эти массимы потом подстовлять под неактивной ссылкой.
Подскажите пожалуйста.
 

Dl

Новичок
Можно сделать массив
$Arr = Array (
'ссылка1' => Array (
'адрес11' => 'ссылка11', 'адрес12' => 'ссылка12', ...),
'ссылка2' => Array (
'адрес21' => 'ссылка21', 'адрес22' => 'ссылка22', ...'),
...
);

и в том месте, где выводится span (не ссылка) сделать

foreach ($Arr[$value] as $key => $value) {
echo "<a href=\"$key\">$value</a><br>";
 

John2

Guest
Спасибо за организацию массива, а то не знал как это сделать, всё получилось только немного не так, вместо
PHP:
foreach ($Arr[$value] as $key => $value) {
echo "<a href=\"$key\">$value</a><br>";
я вставил такой же цикл как и был, тоесть получился цикл в цикле (внутренний цикл переменные берёт из 2-го массива), всё хорошо работает, спасибо.

-~{}~ 01.05.04 01:03:

Хотя нет, что то я лохонулся, ничего у меня не получилось :( , а именно имея такой код(извеняюсь что большой, взял конкретный пример со своего сайта, рассматриваю только одну подссылку):
PHP:
$navi1 = array (
'/turkey_bath/' => 'Турецкие бани',
'/russian_bath/' => 'Русские бани',
'/saunas/' => 'Сауны',
'/furniture/' => 'Мебель',
'/showers/' => 'Душевые кабинки',
'/steam/' => 'Паровые кабинки',
'/sanitary/' => 'Сантехника',
'/building/' => 'Строительство'
);

$navi2 = Array (
'Сауны' => Array (
'/saunas/building/' => 'Строительсто саун', 
'/saunas/parnas/' => 'Сауны ПАРНАС',
'/saunas/wellness/' => 'Home WELLNESS',
'/saunas/infrared/' => 'Инфракрасные сауны',
'/saunas/tylo/' => 'Сауны TYLO',
'/saunas/klafs/' => 'Сауны KLAFS',
'/saunas/accessory/' => 'Оборудование и аксессуары')
);

$navi3 = Array (
'Сауны ПАРНАС' => Array (
'/saunas/parnas/standart/' => 'Стандарт', 
'/saunas/parnas/luxe/' => 'Люкс',
'/saunas/parnas/vip' => 'VIP')
);

foreach ($navi1 as $key => $value) { 
$position=strpos($_SERVER['PHP_SELF'],$key);
if($position === 0) {
echo "<li><span id=\"active\">&#8594; $value</span></li>";

	foreach ($navi2[$value] as $key => $value) { 
	$position=strpos($_SERVER['PHP_SELF'],$key);
	if($position === 0) {
	echo "<li><span id=\"active\">&#8594; $value</span></li>";

		foreach ($navi3[$value] as $key => $value) { 
		$position=strpos($_SERVER['PHP_SELF'],$key);
		if($position === 0) {
		echo "<li><span id=\"active\">&#8594; $value</span></li>";

		} else {
		echo "<li>&#8594; <a href='$key'>$value</a></li>"; 
		}}

	} else {
	echo "<li>&#8594; <a href='$key'>$value</a></li>"; 
	}}

} else {
echo "<li>&#8594; <a href='$key'>$value</a></li>"; 
}}
заходя на подпункт (мой пример "Сауны ПАРНАС") раздел "Сауны" остаётся неактивным, заходя на (например "Люкс")
уже имею 2 не активные ссылки, которые должны быть активными.
Кто знает не подскажете как провернуть такую операцию?
мне видимо не судьба состряпать такое меню :(

-~{}~ 03.05.04 21:49:

Неужели никто не может помочь :(
Наверника каждый 2-ой знает как это сделать.
 

Line

Guest
Используй imprimatur.
Там это реализованно в полном объеме.
 

John2

Guest
Во первых imprimatur нет в открытом доступе, во вторых я про php говорю а не про парсер, я думаю на пхп это реально тоже сделать, другой вопрос "как".

-~{}~ 03.05.04 23:39:

Опять же на последнем сайте Лебедева именно такое меню которое нужно www.only.ru и как они его делают :(
Я конечно понимаю что это всё на parser'e сделано, но неужели на php это не возможно :( :confused:
 

fixxxer

К.О.
Партнер клуба
какой кошмар.
ты грубо гвооря пять раз по пять сложением считаешь.
используй массивы массивов.
 

John2

Guest
И каким же образом их можно тут использовать :confused:
если можно маленький примерчик.
 

Line

Guest
Тут вопрос вот в чем, сколько уровней вложенности тебя интересует?
Молодежь которая работает у Лебедева, как правило всегда допускают грубую ошибку, они превышаю вложенность документа относительно корня более чем на три уровня.
А как показывает практика, человеку трудно ориентироваться на уровне вложенности больше чем 3.
Тебе еще нужно его поганое меню?
Делай с тройной вложенностью и не парься.
 

SiMM

Новичок
Автор оригинала: Line
Делай с тройной вложенностью и не парься.
Это костыль, а не решение. Нормальное решение делается при помощи рекурсии и количество вложенностей для него (в пределах разумного ;) ), безрезлично.
 

Line

Guest
Согласен, если речь идет о каталоге.
В нем реально нужно много "листьев".
 

fixxxer

К.О.
Партнер клуба
Нормальный алгоритм здесь - рекурсивный. Ну или цикл, в который эта рекурсия разворачивается. При этом никто не мешает ограничиваться любым уровнем вложенности, например 3.
 

John2

Guest
Всего нужно 3-х уровневое меню (включая сам корень),
щас пытаюсь сделать его с помощью циклов, пока не получается, с помощью рекурсии не знаю как делать :(
 

SiMM

Новичок
Идея проста - например, функция вывода массива массивов с неограниченной вложенностью:
PHP:
function example($a,$pre=''){
  foreach ($a as $k=>$v){
    if (is_array($v)){
      echo "$pre$k =><br>\n";
      example($v,$pre.'-');
    }
    else echo "$pre$v<br>\n";
  }
}

$s=array('Меню 1',
         'Меню 2'=>array('Меню 2.1',
                         'Меню 2.2'=>array('Меню 2.2.1','Меню 2.2.2'),
                         'Меню 2.3'),
         'Меню 3');
example($s);
PS: да простят меня модераторы ;)
 

John2

Guest
Немного у меня не получается этот пример.
Я пытаюсь сделать немного по другому, без рекурсиии.
Подскажите в чем моя ошибка, имию примерно такой код:
PHP:
foreach ($navi1 as $key => $value) {
if ($REQUEST_URI=="$key") {
echo "<li>$value</li>";

		foreach ($navi2[$key] as $key => $value) { 
		echo "<li><a href='$key'>$value</a></li>"; 
		}

} else {
echo "<li><a href='$key'>$value</a></li>";

		foreach ($navi4[$value] as $key => $value) { 
		echo "<li><a href='$key'>$key</a></li>"; 
		}

}}
тоесть активна ссылка или не активна в данный момент у меня всё равно выводится цикл
PHP:
          foreach ($navi2[$key] as $key => $value) { 
		echo "<li><a href='$key'>$value</a></li>"; 
}
Вродебы всё работает, только после каждой строчки меню выдаётся такая ошыбка
"Warning: Invalid argument supplied for foreach() in
on line ..."
в строке
PHP:
foreach ($navi4[$value] as $key => $value) {
та, котороя идёт после
PHP:
} else {
В чем может быть проблема?

-~{}~ 05.05.04 01:17:

Всем спасибо, вроде всё получилось.
 
Сверху