2016-05-01 111 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沒有遞歸變體,並且它們只是取值。既然你沒有明確要求這個,我會在那裏停下來。