PHP рекурсивная функция, чтобы получить хлеб
-
27-09-2019 - |
Вопрос
Потратил несколько часов на это и нуждается в некоторой экспертизе.
У меня такового стола:
[id] [name] [parent_id]
1 fruits 0
2 orange 1
3 lemon 2
4 steak 0
Когда я хожу в лимон, я хочу, чтобы парика была как:
Главная> Фрукты> Оранжевый> Лимон
И лимон не быть ссылкой, но остальное - это ссылка.
Какие-либо предложения?
Лучший, который я нашел, это, но это делает все в ссылке.
function createPath($id, $category_tbl) {
$s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
$r = mysql_query($s);
$row = mysql_fetch_array($r);
if($row['parent_id'] == 0) {
$name = $row['name'];
return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > ";
} else {
$name = $row['name'];
return createPath($row['parent_id'],$category_tbl). " <a href='index.php?folder_id=$id'>".$name."</a> >";
}
}
Ответ ниже из Эрвина дал мне то, что мне нужно сделать это работать.
function createPath($id, $category_tbl, $except = null) {
$s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
$r = mysql_query($s);
$row = mysql_fetch_array($r);
if($row['parent_id'] == 0) {
$name = $row['name'];
if(!empty($except) && $except == $row['id']) {
return "<a href='index.php'>Admin</a> » ".$name."";
}
return "<a href='index.php'>Admin</a> » <a href='index.php?folder_id=$id'>".$name."</a> » ";
} else {
if(!empty($except) && $except == $row['id']) {
$name = $row['name'];
return createPath($row['parent_id'],$category_tbl, false). " $name";
}
$name = $row['name'];
return createPath($row['parent_id'],$category_tbl, false). " <a href='index.php?folder_id=$id'>".$name."</a> »";
}
}
Решение
добавить третий параметр, который будет названием ссылки, которая предположительно не будет отображаться в тег
function createPath($id, $category_tbl, $except = null) {
$s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
$r = mysql_query($s);
$row = mysql_fetch_array($r);
if($row['parent_id'] == 0) {
$name = $row['name'];
return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > ";
} else {
$name = $row['name'];
if(!empty($except) && $except == $name)
return createPath($row['parent_id'],$category_tbl, $except)." ".$name;
}
return createPath($row['parent_id'],$category_tbl, $except). " <a href='index.php?folder_id=$id'>".$name."</a> >";
}
}
Другие советы
Разве этот код не получает результаты назад Lemon > Orange > Fruits > Home
? Как предложил JONI, я бы поставил результаты в массиве, а затем построить выходную строку.
Если у вас есть другая информация в базе данных, которая вам нужна, такая как URL, кроме folder_id=$id
Вы можете хранить его как
$breadcrumb_items = array(
0 => array( 'id' => '3',
'title' => 'Lemon',
'url' => 'LemonURL'
),
1 => array( 'id' => '2',
'title' => 'Orange',
'url' => 'OrangeURL'
),
2 => array( 'id' => '1',
'title' => 'Fruit',
'url' => 'FruitURL'
),
3 => array( 'id' => '0',
'title' => 'Home',
'url' => 'HomeURL'
)
);
Тогда звоните array_reverse
Чтобы исправить заказ массива и построить свой HTML. Обязательно установите флаг, чтобы предотвратить попадание последнего элемента в ссылку.
$targetID = 3; //Lemon
foreach( $breadcrumb_items as $breadcrumb ){
...
if( $breadcrumb['id'] != $targetID ){ //if the id does not match our target id
//add link code
}
...
}
Вместо того, чтобы выводить его как раз вовремя, создайте массив и буфер, результаты там. После того, как массив заполнен createPath()
Вы можете выводить хлебную корпус A для петли, который знает, что, что последний элемент (по count()
) и может избежать, чтобы сделать ссылку из него.