从钥匙上取下扩展名


remove the extension from the key

如何从数组键中删除扩展,即.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_maparray_reduce没有递归变体,它们无论如何都只取值。既然你没有明确要求,我就到此为止。