从密钥中删除扩展名

时间:2016-05-01 06:24:23

标签: php arrays str-replace

如何从数组键中删除扩展名,即.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));

但是唉。

怎么办?

4 个答案:

答案 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_maparray_reduce没有递归变体,它们只会采用值。既然你没有明确要求这个,我就会停在那里。