首先原題是這樣子的:
寫乙個函式,計算出兩個檔案的相對路徑,如 $a = '/a/b/c/d/d.php',$b = '/a/b/1/2/c.php'
計算出的$b相對於$a的相對路徑應該是:../../c/d
那麼對於網上給出的答案,看了看貌似只能針對題目中給出的那個路徑來計算,如果路徑一變化,類似下面這樣,那麼那些程式好像沒用了,當然有些是有用,但是還是報一些警告出來。。。。。
例如:$a = '/a/b/c/d/e/f/g/h/e.php'
$b = '/a/b/1/2/c.php'
再例如:
$a = '/a/e.php'
$b = '/a/b/c/d/1/2/c.php'
再例如:
$a = '/a/b/c/d/d.php'
$b = '/a/b/c/d/c.php'
所以這個情況挺多的,不能僅僅看當下的需求!
首先還是說下這個題目的意圖吧,它的要求是求$b相對於$a的乙個相對路徑,也就是說是個什麼意思呢。
就是從$b所給定的那個檔案通過相對路徑的方式表示怎麼樣可以找到$a所對應的那個檔案。就那題目給出的那個路徑來解釋,就是我們怎麼$b到達$a呢,那首先從$b出發需要「../」上一級目錄然後再「../」上一級目錄來到了「/a/b」這個目錄下,然後接著再從這個目錄下出發,連線上「/c/d」然後就來到了$a所對應的目錄。
也就是說,這個題目的主要任務是找到從$b到$a需要「上幾級」才能到達和$a具有相同目錄的地方,然後接著連線上$a接下來的那部分,那麼我們就得到了答案,所以題目的關鍵是找到底需要「上幾級」!
廢話不多說,直接看**:
/**
* 計算$b相對於$a的相對路徑
* @param string $a
* @param string $b
* @return string
*/function getrelativepath($a, $b)
} while (++$n);
$relativepath .= str_repeat('../', count($pathb) - $n);
$relativepath .= implode('/', array_splice($patha, $n));
return $relativepath;
}$res = getrelativepath($a, $b);
var_dump($res);
經過測試呢,上面列舉的情況都滿足。
那這段程式需要解釋的就是:
$len為什麼需要求出$a和$b中路徑最少的乙個?
那是因為下面我們通過do{}while();迴圈來從0即起始路徑開始向下一直對比$a和$b的路徑,希望找到是從哪個路徑開始導致$a和$b不一樣了,也就是從找到了$a和$b路徑總共相同的路徑數是幾個了。那在尋找的過程中,如果出現$a和$b的路徑一直不相等那麼$n會一直增加導致陷入死迴圈,所以還需要另外乙個條件,就是我們需要讓$n的最大值不能超過$a和$b中路徑最短的乙個,為什麼呢?因為$n一旦大於了$len那說明有乙個路徑已經結束了,那直到結束也沒有找到$a和$b不一樣的那個部分,那說明其中最短路徑的長度正好是他們路徑相同的數目。(多數其它程式就範了這個錯誤),也就不需要繼續找了,因為我們已經找到了。
找到了相同路徑的個數之後,首先需要計算的是:從$b到$a到底需要幾個「../」,那麼計算方法就是用「count($pathb) - $n」,為什麼呢?因為$n表示路徑相同的數目,而「 count($pathb)」表示$b的路徑數,那麼相互一減就得到了不同的路徑數目也就是需要的幾個「../」,那麼減完之後的結果一定是大於等0的值,所以沒問題!
找到了從$b到$a需要幾個「../」之後的任務就是將這幾個「../」和$a中不同的路徑部分拼接一下就可以了,也就是**:$relativepath .= implode('/', array_splice($patha, $n));
到此,結束!
一道面試題 檔案拷貝
情景 在面試過程中,求職者被要求寫乙個檔案拷貝函式。問 你是怎樣理解 拷貝 的?答 嗯.就是把檔案的內容複製到新檔案。問 那麼時間戳呢?答 不拷貝。問 目標檔名是否必須相同?答 不必。問 那它的名字 能否一樣?答 這個.不能。問 要不要擔心名字欺騙?比如土耳其 i 注1 答 不要擔心。問 檔案位置是...
從一道php面試題說起
面試題目 setcookie name test echo cookies name 請說出程式結果 能說出第一次與第二次的區別者加分 本來一開始我認為不就是設定乙個cookie,然後讀出來的問題,但是被那個後面的提示搞迷惑了從來沒有想過這樣的問題。面試的時候也沒有想出答案,後來在面試官的指點下搞清...
PHP面試題之寫乙個函式算出兩個檔案的相對路徑
原題 這個問題簡單可以很簡單,複雜可以很複雜 看了下 網上的解題答案,發現只能解答特殊情況的路徑,比如 它們檔案路徑有著一對一的關係 a a b c d e.php b a b 12 34 c.php a e c a e.php b a b f c.php 於是按照自己的思路重新寫了下.說明 不考慮...