2011-06-09 42 views
9

是什麼做以下的最佳方式:如何在PHP中正確拆分路徑

我得到的路徑與AJAX請求

例如dir1/dir2/dir3/dir4

我需要出示像這樣在我的網頁:

dir1 >> dir2 >> dir3 >> dir4 
他們每個人是與href屬性分別爲

/dir1 

/dir1/dir2 

/dir1/dir2/dir3 

/dir1/dir2/dir3/dir4 

HTML錨標記

什麼最優雅和高效的方式來實現這一目標?提前

<?php 
$dirs = explode(PATH_SEPARATOR, $this->metadata["path"]); 
    foreach ($dirs as $key=>$val) { 
      if ($val == '') { 
       continue; 
      } 
      $pathArray = array(); 
      for ($i = 0; $i <= $key; $i++) { 
       array_push($pathArray, $dirs[$i]); 
      } 
      $path = implode('/', $pathArray); 
      echo " >> <a href=" . $path . ">" . truncate($val) . "</a>"; 
    } 
    ?> 

感謝

+0

雖然'truncate'函數不存在,但對我來說似乎是正確的(並且不那麼髒)。這是一個自定義函數,還是你的意思是'trim'? – 2011-06-09 08:43:42

+0

它的一個自定義函數... so..u認爲它是一個優雅的代碼塊?:) – nezgerland 2011-06-09 08:44:34

+0

嗯,這就是我會這麼做的。如果這是優雅的,那麼hoorray:D – 2011-06-09 08:46:20

回答

11

這樣的事情,也許(如果我得到你的意圖右):

到目前爲止,我在做這樣的事情,我覺得是真髒

<?php 
$str = 'dir1/dir2/dir3/dir4'; 

$output = array(); 
$chunks = explode('/', $str); 
foreach ($chunks as $i => $chunk) { 
    $output[] = sprintf(
     '<a href="#/%s">%s</a>', 
     implode('/', array_slice($chunks, 0, $i + 1)), 
     $chunk 
    ); 
} 

echo implode(' &gt;&gt; ', $output); 

輸出:

<a href="#/dir1">dir1</a> &gt;&gt; 
<a href="#/dir1/dir2">dir2</a> &gt;&gt; 
<a href="#/dir1/dir2/dir3">dir3</a> &gt;&gt; 
<a href="#/dir1/dir2/dir3/dir4">dir4</a> 
+0

我最喜歡你的解決方案,我會和你一起去的。非常感謝您的時間和答案。 – nezgerland 2011-06-09 08:55:01

+0

不同的文件系統用不同的斜槓怎麼辦? – Sevenearths 2018-03-06 10:53:30

+0

@Sevenearths我沒有看到與os特定文件系統的關係。但是,如果需要,只需在代碼中使用除「/」之外的其他字符。 – Yoshi 2018-03-06 13:30:51

1

我會做這樣的......

<?php 

$path = 'dir1/dir2/dir3/dir4'; 
$dirs = explode('/', $path); 

while (count($dirs) > 0) { 
    $link = '/' . implode($dirs, '/'); 
    $text = array_pop($dirs); 
    $breadcrumb = "<a href=\"$link\">$text</a>" . $breadcrumb; 
    if (count($dirs) > 0) { 
     $breadcrumb = ' &gt;&gt; ' . $breadcrumb; 
    } 
} 

echo $breadcrumb; 

如果您是基於你不應該需要使用PATH_SEPARATOR因爲網址應該始終使用/的URL獲得此路徑。如果從文件系統路徑得到的,你會需要更換它,而不是'/'在線4

+0

感謝PATH_SEPARATOR ..我現在正在爆炸('/',$ path):) – nezgerland 2011-06-09 09:13:01

+2

@ user787124:請注意'PATH_SEPARATOR'是/不是\ - 它是;或者:分別在Windows和Unix上。它可能是你想要使用的'DIRECTORY_SEPARATOR'。 – 2011-06-09 09:24:07

+0

很好的答案。謝謝老兄 – Thamaraiselvam 2016-04-06 13:49:25

1

瓦爾1

<?php 

    $str = '/dir1/dir2/dir3/dir4'; 
    $arr = array_filter(explode('/',$str)); 
    $out = array('/'.implode('/',$arr).'/'); 
    while((array_pop($arr) and !empty($arr))){ 
     $out[] = '/'.implode('/',$arr).'/'; 
    }; 

    print_r($out); 

    /* 
    Array(
     [0] => /dir1/dir2/dir3/dir4/ 
     [1] => /dir1/dir2/dir3/ 
     [2] => /dir1/dir2/ 
     [3] => /dir1/ 
    ) 
    */ 

?> 

無功2(鏈接)

<?php 

    $str = '/dir1/dir2/dir3/dir4'; 
    $arr = array_filter(explode('/',$str)); 
    $out = array('<a href="/'.implode('/',$arr).'/">'.basename($str).'</a>'); 
    while((array_pop($arr) and !empty($arr))){ 
     $out[] = '<a href="/'.implode('/',$arr).'/">'.end($arr).'</a>'; 
    }; 

    print_r($out); 

    /* 
    Array 
    (
     [0] => <a href="/dir1/dir2/dir3/dir4/">dir4</a> 
     [1] => <a href="/dir1/dir2/dir3/">dir3</a> 
     [2] => <a href="/dir1/dir2/">dir2</a> 
     [3] => <a href="/dir1/">dir1</a> 
    ) 
    */ 

?>