如何从数组键中删除扩展名,即.md。 它应该看起来像这个键:[about] =>页/ about.md 阵列:
阵列:
(
[_desktop.md] => pages/_desktop.md
[about.md] => pages/about.md
[contact.md] => pages/contact.md
[errorpages] => Array
(
[403.md] => pages/errorpages/403.md
[404.md] => pages/errorpages/404.md
[500.md] => pages/errorpages/500.md
[503.md] => pages/errorpages/503.md
)
[home.md] => pages/home.md
[indexpage.md] => pages/indexpage.md
)
代码:
function generatePathTree($dir) {
$pathstack = array($dir);
$contentsroot = array();
$contents = &$contentsroot;
while ($path = array_pop($pathstack)) {
$contents[basename($path)] = array();
$contents = &$contents[basename($path)];
foreach (scandir($path) as $filename) {
if ('.' != substr($filename, 0, 1)) {
$newPath = $path.'/'.$filename;
if (is_dir($newPath)) {
array_push($pathstack, $newPath);
$contents[basename($newPath)] = array();
} else {
$contents[basename($filename)] = $newPath;
}
}
$contentsroot = preg_replace("/\\.[^.]*$/", "", basename($filename));
}
}
return $contentsroot[basename($dir)];
}
我试过了:
$contentsroot = preg_replace("/\\.[^.]*$/", "", basename($filename));
但是唉。
怎么办?
答案 0 :(得分:0)
在此代码块中(这是分配文件名而不是dir):
else {
$fileExtRemoved = preg_replace("/[\.](.*)/", "", $filename);
$contents[basename($fileExtRemoved)] = $newPath;
}
你的正则表达式有点偏,这是正确的: https://3v4l.org/mMPrt
答案 1 :(得分:0)
您可以将旧值分配给新密钥,然后取消设置旧密钥
$arr['about'] = $arr['about.md'];
unset($arr['about.md']);
答案 2 :(得分:0)
所有这三个角色都是什么?
那么为什么不使用sub_str($key , 0, -3);
呢?
如果它总是三个字符它应该工作,并且我认为它似乎是三个。
所以也许:
$contents[basename(substr($filename,0,-3))];
答案 3 :(得分:0)
要求:如果字符串中存在第一个.
,请删除数组键字符串的任何部分。
解决方案:
list($key,) = explode('.', $old_key);
$arr[$key] = $arr[$old_key];
unset($arr[$old_key]);
附注:必须有更好的方法来进行递归循环。但快速浏览表明array_walk_recursive
仅在叶节点上运行; array_map
和array_reduce
没有递归变体,它们只会采用值。既然你没有明确要求这个,我就会停在那里。