从密钥中删除扩展名
问题描述:
如何从数组密钥中删除扩展名,即.md。 它应该是这样的关键:[讲述] =>页/ 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));
但唉。
怎么办?
答
在此代码块(这是文件名被分配的,而不是DIR):
else {
$fileExtRemoved = preg_replace("/[\.](.*)/", "", $filename);
$contents[basename($fileExtRemoved)] = $newPath;
}
你的正则表达式是有点过,这是正确的: https://3v4l.org/mMPrt
答
可以assigne旧值旧钥匙,然后取消旧钥匙
$arr['about'] = $arr['about.md'];
unset($arr['about.md']);
答
这是它们的三个字符?
那么,为什么不使用sub_str($key , 0, -3);
?
如果它总是三个字符它应该工作,并且正如我所看到的,它似乎是三个。
所以也许:
$contents[basename(substr($filename,0,-3))];
答
要求:第一.
后删除阵列钥匙串的任何部分,如果它在字符串中存在。
解决方案:
list($key,) = explode('.', $old_key);
$arr[$key] = $arr[$old_key];
unset($arr[$old_key]);
一个侧面说明:必须有一个更好的方式做递归循环。但快速查看表明array_walk_recursive
只在叶节点上运行; array_map
和array_reduce
没有递归变体,并且它们只是取值。既然你没有明确要求这个,我会在那里停下来。
更新我的代码,你的正则表达式有点偏离。 –