问题:写一个函数,算出两个文件的相对路径
如 $a = ‘/a/b/c/d/e/f.php’;
$b = ‘/a/b/12/34/c.php’;
计算出$b相对于$a的相对路径是../../../12/34
最初看到这个问题的时候,立马就想起了yii框架中的实现。yii生成网站的时候,就用到了相对路径的逻辑。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  | 
						   /**       * Returns variant of $path1 relative to $path2       *       * @param string $path1       * @param string $path2       * @return string $path1 relative to $path2       */      protected function getRelativePath($path1,$path2)      {          $segs1=explode(DIRECTORY_SEPARATOR,$path1);          $segs2=explode(DIRECTORY_SEPARATOR,$path2);          $n1=count($segs1);          $n2=count($segs2);          for($i=0;$i<$n1 && $i<$n2;++$i)          {              if($segs1[$i]!==$segs2[$i])                  break;          }          if($i===0)              return "'".$path1."'";          $up='';          for($j=$i;$j<$n2-1;++$j)              $up.='/..';          for(;$i<$n1-1;++$i)              $up.='/'.$segs1[$i];          return 'dirname(__FILE__).\''.$up.'/'.basename($path1).'\'';      }  }  | 
					
$a 路由到 $b,最先的操作应该是../ 或者 ./。从根目录开始,相同的父路径在计算相对路径的时候,是没有任何影响的。上面的问题可以转化成求:
$a1 = ‘/c/d/e/f.php’;
$b1 = ‘/12/34/c.php’;
这两者的相对路径。这样,就清晰多了。
实现方法如下:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32  | 
						 function getRelativePath($path1, $path2) {      $n1 = explode('/', $path1);      $n2 = explode('/', $path2);      foreach ($n1 as $key => $val) {          if ($val == $n2[$key]) {              unset($n1[$key]);              unset($n2[$key]);          } else {              break;          }      }      // 重新索引      $n1 = array_values($n1);      $n2 = array_values($n2);      $up = '';      for ($i = 0; $i < count($n1) -1 ; $i++) {          $up .= '../';      }      if (!$up) {          $up = './';      }      for ( $j = 0; $j < count($n2) -1; $j++) {          $up .= $n2[$j] . '/';      }      return $up . $n2[count($n2) - 1] ;  }  |