php 怎么转换成绝对路径
短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
本文操作环境:Windows7系统、PHP7.4版、DELL G3电脑
php 怎么转换成绝对路径?
PHP 相对路径转换为绝对路径 realpath
* 相对路径 -> 绝对路径 realpath
<?php
define('PATH_MAX', 255);
function sub_rel2abs(string $in_rel, string &$out_abs) {
$i_rtn = 0; // return value
$ss_rel = ""; // for relative path build
$st_fpos = 0; // front separator index
$sv_path = []; // pide path to array
$st_pos = strpos($in_rel, DIRECTORY_SEPARATOR);
$npos = 0;
while ($npos != $st_pos) {
if ($st_pos != 0) {
array_push($sv_path, substr($in_rel, $st_fpos, $st_pos - $st_fpos));
}
// next...
$st_fpos = $st_pos; // set current pos to last pos
$st_pos++; // from next index
$st_pos = strpos($in_rel, DIRECTORY_SEPARATOR, $st_pos); // next separator index
} // while ( $npos != $st_pos )
// final separator
array_push($sv_path, substr($in_rel, $st_fpos));
$lpc = 0; // loop count
$i_max = count($sv_path);
while ($lpc < $i_max && 0 === $i_rtn) {
$ss_rel .= $sv_path[$lpc];
// relative path => relative path
$c_abs = realpath($ss_rel);
if ($c_abs === false) {
$i_rtn = -1;
} else {
$ss_rel = $c_abs;
$i_rtn = 0;
}
$lpc++;
} // while (count($sv_path)>0)
// normal ending
if (0===$i_rtn) {
$out_abs = $ss_rel; // set converted path
}
return $i_rtn;
}
// test
$inDir = "/Users/Mch/Code/php/Directory";
is_dir($inDir) || mkdir($inDir, 0777, true);
$wd = __DIR__;
chdir($inDir);
$out = "";
echo sub_rel2abs("../../../eclipse-workspace/blog.zip", $out).PHP_EOL;
echo $out.PHP_EOL;
chdir($wd);
@rmdir($inDir);
output:
0
/Users/Mch/eclipse-workspace/blog.zip
这里直接realpath就可以了,为什么多此一举?
* 绝对路径 -> 相对路径
<?php
function abs2rel(string $base, string $path) {
if (is_dir($base)) {
$base = rtrim($base, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . ".";
}
$a = explode(DIRECTORY_SEPARATOR, $base);
$b = explode(DIRECTORY_SEPARATOR, $path);
$d = []; // $path push
$i = count($a)-1;
$sliceEquals = function($a, $b, $j) {
if ($j >= count($a) || $j >= count($b)) {
throw new Exception('$j out of range');
}
for ($i = $j; $i >= 0; $i--) {
if (strcmp($b[$i], $a[$i])!==0) {
return false;
}
}
return true;
};
// 找到a,b数组元素相同的下标
while (array_pop($a)) {
$i = count($a)-1;
if (isset($b[$i])) {
if ($sliceEquals($a, $b, $i)) {
break;
}
}
array_push($d, "..");
}
// 从首个不同元素开始
for ($i+=1; $i < count($b); $i++) {
array_push($d, $b[$i]);
}
return ".".DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $d);
}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341