从密钥中删除扩展名

remove the extension from the key

如何删除数组键的扩展名,即.md。 它应该看起来像这个键:[about] => 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;
}

你的正则表达式有点不对,这是正确的: 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_maparray_reduce 没有递归变体,无论如何它们只取值。既然你没有明确要求,我就到此为止了。