如何从数组键中删除扩展,即.md。它应该看起来像这个键:[关于]=>pages/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));
但是,唉。
怎么办?
在这个代码块中(这是分配文件名而不是目录的地方):
else {
$fileExtRemoved = preg_replace("/['.](.*)/", "", $filename);
$contents[basename($fileExtRemoved)] = $newPath;
}
您的regexp有点错误,这是正确的:https://3v4l.org/mMPrt
您可以将旧值分配给新密钥,然后取消设置旧密钥
$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
没有递归变体,它们无论如何都只取值。既然你没有明确要求,我就到此为止。