一道PHP面試題,求兩個檔案的相對路徑

2021-07-23 05:09:15 字數 1958 閱讀 5990

首先原題是這樣子的:

寫乙個函式,計算出兩個檔案的相對路徑,如 $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 於是按照自己的思路重新寫了下.說明 不考慮...