2016-05-01 112 views
1

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

但唉。

怎么办?

+0

更新我的代码,你的正则表达式有点偏离。 –

回答

0

在此代码块(这是文件名被分配的,而不是DIR):

else { 
     $fileExtRemoved = preg_replace("/[\.](.*)/", "", $filename); 
     $contents[basename($fileExtRemoved)] = $newPath; 
} 

你的正则表达式是有点过,这是正确的: https://3v4l.org/mMPrt

0

可以assigne旧值旧钥匙,然后取消旧钥匙

$arr['about'] = $arr['about.md']; 
    unset($arr['about.md']); 
0

这是它们的三个字符?
那么,为什么不使用sub_str($key , 0, -3);

如果它总是三个字符它应该工作,并且正如我所看到的,它似乎是三个。

所以也许:

$contents[basename(substr($filename,0,-3))]; 
0

要求:第一.后删除阵列钥匙串的任何部分,如果它在字符串中存在。

解决方案:

list($key,) = explode('.', $old_key); 
$arr[$key] = $arr[$old_key]; 
unset($arr[$old_key]); 

一个侧面说明:必须有一个更好的方式做递归循环。但快速查看表明array_walk_recursive只在叶节点上运行; array_maparray_reduce没有递归变体,并且它们只是取值。既然你没有明确要求这个,我会在那里停下来。