Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面包屑菜单PHP生成额外的空白锚链接_Php_Html_Breadcrumbs - Fatal编程技术网

面包屑菜单PHP生成额外的空白锚链接

面包屑菜单PHP生成额外的空白锚链接,php,html,breadcrumbs,Php,Html,Breadcrumbs,假设我有以下URL: https://site.website/products/products-level-2 在products-level-2上,我有一个面包屑英雄部分。我希望看到的是: 产品/产品级别2 然而,根据我目前的方法,我看到: /Products/Products Level 2/ ^^上面有以下HTML输出: / / / / 解决方案: 最终的工作代码如下所示: <?php // 1. Get URL $crumbs = explode("/",$_SER

假设我有以下URL:

https://site.website/products/products-level-2
products-level-2
上,我有一个面包屑英雄部分。我希望看到的是:

产品/产品级别2

然而,根据我目前的方法,我看到:

/Products/Products Level 2/

^^上面有以下HTML输出:


/ 
/ 
/
/ 
解决方案: 最终的工作代码如下所示:

<?php
// 1. Get URL
$crumbs = explode("/",$_SERVER["REQUEST_URI"]);
array_filter($crumbs);

$count = count($crumbs);
$address = $_SERVER['HTTP_HOST'];

// 2. Strip extras
$build = '';
$i = 0;

foreach($crumbs as $crumb) {

    $href = (++$i != $count ? 'href="' . $address . $build . '"' : '');

    $build .= '/'.$crumb;
    $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
    echo
        "<a class='crumbMenu' " . $href . ">".$crumb."</a> 
        <span class='slash'>/</span> ";
}
?>
2。在href中,它输出double//(即site.website//products)

之所以发生这种情况,是因为它首先迭代数组中的空白元素,因为默认情况下添加了一个前斜杠,第二个循环已经存在一个前斜杠,因此它会加倍。

问题1的解决方案解决了这个问题

3。我也不希望最后一项(即产品级别2)成为链接(因为用户正在该页面上查看面包屑)。

$crumbs
上运行
array\u filter
后,您需要使用以下方法计算数组中的元素数:

$count = count($crumbs);
然后,当您在阵列中循环时,您需要在循环是阵列的最后一个循环时进行训练:

$i = 0;

foreach($crumbs as $crumb) {

    $href = (++$i != $count ? 'href="' . $address . $build . '"' : '');

    // ...rest of foreach
    $build .= '/' . $crumb;
    $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');

    echo "<a class='crumbMenu' " . $href . ">".$crumb."</a><span class='slash'>/</span> ";

}
$i=0;
foreach($crumps as$crump){
$href=(++$i!=$count?href=“”.$address.$build.”“:”);
//…foreach的其余部分
$build.='/'.$crumb;
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb)。”;
回声“/”;
}
4。我不想/出现在面包屑的开头和结尾。

这一问题已通过我对您的第一个问题的解决方案得到解决,该解决方案位于此答案的顶部。

解决方案:
/* A character used as a divider between the breadcrumbs */
$separator = ' / ';

/* The current page uri from which to build breadcrumb trail */
$uri='https://'.$_SERVER['HTTP_HOST'].'/products/computers/microsoft/laptops/acer/professional';

/* capture the path and explode to create an array - removing empty entries in the process */
$crumbs=array_filter( explode( '/', parse_url( $uri, PHP_URL_PATH ) ) );

/* The host and protocol for building correct links */
$host=sprintf( '%s://%s/', parse_url( $uri, PHP_URL_SCHEME ), parse_url( $uri, PHP_URL_HOST ) );

/* placeholder array to store generated links */
$html=[];

/* iterate through the array and build relevant HTML content - append to output array */
foreach( $crumbs as $index => $crumb ){
    /* tweak the text displayed */
    $crumb = ucfirst( str_replace( array( ".php", "_" ), array( "", " " ), $crumb ) );

    /* the path should be all the previous breadcrumb crumbs */
    $path=[];
    for( $i=1; $i < $index; $i++ ) $path[]=$crumbs[ $i ];
    $path=implode( DIRECTORY_SEPARATOR, $path );


    /* create the link used in the html display */
    $html[]= ( $index==count( $crumbs ) ) ? sprintf('<span>%s</span>', $crumb ) : sprintf("<a href='%s%s' class='crumbMenu'>%s</a>", $host, $path, $crumb );
}


echo $uri, "
<style>
    #breadcrumbs{border:1px solid gray;padding:1rem;font-family:calibri,verdana,arial}
    #breadcrumbs *{padding:1rem;}
    #breadcrumbs a,
    #breadcrumbs span:hover{color:blue}
    #breadcrumbs a:hover{color:red;}
    #breadcrumbs span{font-weight:bolder;}
</style>
<div id='breadcrumbs'>",
implode( $separator, $html ),
"</div>";
最终的工作代码如下所示:

<?php
// 1. Get URL
$crumbs = explode("/",$_SERVER["REQUEST_URI"]);
array_filter($crumbs);

$count = count($crumbs);
$address = $_SERVER['HTTP_HOST'];

// 2. Strip extras
$build = '';
$i = 0;

foreach($crumbs as $crumb) {

    $href = (++$i != $count ? 'href="' . $address . $build . '"' : '');

    $build .= '/'.$crumb;
    $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');
    echo
        "<a class='crumbMenu' " . $href . ">".$crumb."</a> 
        <span class='slash'>/</span> ";
}
?>
2。在href中,它输出double//(即site.website//products)

之所以发生这种情况,是因为它首先迭代数组中的空白元素,因为默认情况下添加了一个前斜杠,第二个循环已经存在一个前斜杠,因此它会加倍。

问题1的解决方案解决了这个问题

3。我也不希望最后一项(即产品级别2)成为链接(因为用户正在该页面上查看面包屑)。

$crumbs
上运行
array\u filter
后,您需要使用以下方法计算数组中的元素数:

$count = count($crumbs);
然后,当您在阵列中循环时,您需要在循环是阵列的最后一个循环时进行训练:

$i = 0;

foreach($crumbs as $crumb) {

    $href = (++$i != $count ? 'href="' . $address . $build . '"' : '');

    // ...rest of foreach
    $build .= '/' . $crumb;
    $crumb = ucfirst(str_replace(array(".php","_"),array(""," "),$crumb) . ' ');

    echo "<a class='crumbMenu' " . $href . ">".$crumb."</a><span class='slash'>/</span> ";

}
$i=0;
foreach($crumps as$crump){
$href=(++$i!=$count?href=“”.$address.$build.”“:”);
//…foreach的其余部分
$build.='/'.$crumb;
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb)。”;
回声“/”;
}
4。我不想/出现在面包屑的开头和结尾。

我对第一个问题的解答就在这个答案的顶部,解决了这个问题。

/*用作面包屑之间分隔符的字符*/
/* A character used as a divider between the breadcrumbs */
$separator = ' / ';

/* The current page uri from which to build breadcrumb trail */
$uri='https://'.$_SERVER['HTTP_HOST'].'/products/computers/microsoft/laptops/acer/professional';

/* capture the path and explode to create an array - removing empty entries in the process */
$crumbs=array_filter( explode( '/', parse_url( $uri, PHP_URL_PATH ) ) );

/* The host and protocol for building correct links */
$host=sprintf( '%s://%s/', parse_url( $uri, PHP_URL_SCHEME ), parse_url( $uri, PHP_URL_HOST ) );

/* placeholder array to store generated links */
$html=[];

/* iterate through the array and build relevant HTML content - append to output array */
foreach( $crumbs as $index => $crumb ){
    /* tweak the text displayed */
    $crumb = ucfirst( str_replace( array( ".php", "_" ), array( "", " " ), $crumb ) );

    /* the path should be all the previous breadcrumb crumbs */
    $path=[];
    for( $i=1; $i < $index; $i++ ) $path[]=$crumbs[ $i ];
    $path=implode( DIRECTORY_SEPARATOR, $path );


    /* create the link used in the html display */
    $html[]= ( $index==count( $crumbs ) ) ? sprintf('<span>%s</span>', $crumb ) : sprintf("<a href='%s%s' class='crumbMenu'>%s</a>", $host, $path, $crumb );
}


echo $uri, "
<style>
    #breadcrumbs{border:1px solid gray;padding:1rem;font-family:calibri,verdana,arial}
    #breadcrumbs *{padding:1rem;}
    #breadcrumbs a,
    #breadcrumbs span:hover{color:blue}
    #breadcrumbs a:hover{color:red;}
    #breadcrumbs span{font-weight:bolder;}
</style>
<div id='breadcrumbs'>",
implode( $separator, $html ),
"</div>";
$separator='/'; /*要从中构建面包屑线索的当前页面uri*/ $uri='https://'.$\u服务器['HTTP\u主机]./products/computers/microsoft/laptops/acer/professional'; /*捕获路径并分解以创建数组-删除流程中的空条目*/ $crumps=array_filter(分解('/',解析_url($uri,PHP_url_PATH)); /*用于建立正确链接的主机和协议*/ $host=sprintf(“%s://%s/”,parse_url($uri,PHP_url_方案),parse_url($uri,PHP_url_host)); /*用于存储生成链接的占位符数组*/ $html=[]; /*迭代数组并构建相关的HTML内容-附加到输出数组*/ foreach($crumps as$index=>$crump){ /*调整显示的文本*/ $crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb)); /*路径应该是所有以前的面包屑屑*/ $path=[]; 对于($i=1;$i<$index;$i++)$path[]=$crumbs[$i]; $path=内爆(目录分隔符,$path); /*创建html显示中使用的链接*/ $html[]=($index==count($crumps))?sprintf(“%s”,$crump):sprintf(“,$host,$path,$crump); } echo$uri,“ #面包屑{边框:1px纯灰;填充:1rem;字体系列:calibri、verdana、arial} #面包屑*{padding:1rem;} #面包屑a, #面包屑跨距:悬停{颜色:蓝色} #面包屑a:悬停{颜色:红色;} #面包屑跨距{font-weight:bold;} ", 内爆($separator,$html), "";
/*用作面包屑之间分隔符的字符*/
$separator='/';
/*要从中构建面包屑线索的当前页面uri*/
$uri='https://'.$\u服务器['HTTP\u主机]./products/computers/microsoft/laptops/acer/professional';
/*捕获路径并分解以创建数组-删除流程中的空条目*/
$crumps=array_filter(分解('/',解析_url($uri,PHP_url_PATH));
/*用于建立正确链接的主机和协议*/
$host=sprintf(“%s://%s/”,parse_url($uri,PHP_url_方案),parse_url($uri,PHP_url_host));
/*用于存储生成链接的占位符数组*/
$html=[];
/*迭代数组并构建相关的HTML内容-附加到输出数组*/
foreach($crumps as$index=>$crump){
/*调整显示的文本*/
$crumb=ucfirst(str_替换(数组(“.php”、“”)、数组(“、”)、$crumb));
/*路径应该是所有以前的面包屑屑*/
$path=[];
对于($i=1;$i<$index;$i++)$path[]=$crumbs[$i];
$path=内爆(目录分隔符,$path);
/*创建html显示中使用的链接*/
$html[]=($index==count($crumps))?sprintf(“%s”,$crump):sprintf(“,$host,$path,$crump);
}
echo$uri,“
#面包屑{边框:1px纯灰;填充:1rem;字体系列:calibri、verdana、arial}
#面包屑*{padding:1rem;}
#面包屑a,