2014-11-05 155 views
0

參見前面的問題而被部分回答了,但出現了一個變化的腳本要求:PHP - Exploding/Moving/FilenamePHP - 爆炸/ SUBSTR /文件名

我是新來的PHP和我堅持。我有大量文件看起來像這樣:

2014-04-01 NS122345 - 日期,人的姓名縮寫以及員工代碼。

我希望能夠將具有NS或JB或GA的文件移動到相關文件夾/目錄中。所以對於NS來說,它會進入Nathan Saunders文件夾,因爲JB會進入Joe Bailey文件夾。

我的目錄結構是這樣的:

root/wan/upload - Where files/images/docs are stored. Inside upload folder i have: 
>2014-04-08 NS6565.doc 
>2012-01-03 JB8932.doc 
>2013-02-01 GA5434.doc 
>etc 
root/wan/administrator/components/com_upload - where my code is stored 

這是移動,創建並檢查文件名,並把它在正確的文件夾我的PHP代碼:

$dir = JPATH_BASE . DS . "upload"; 
$folders = array('SE528733B'=>'/var/www/vhosts/test.cariss.co.uk/httpdocs/wan/upload/528733B','SE125673B'=>'/var/www/vhosts/test.cariss.co.uk/httpdocs/wan/upload/125673B','SE3452312'=>'/var/www/vhosts/test.cariss.co.uk/httpdocs/wan/upload/3452312'); 
$files = scandir($dir); 
foreach($files AS $file){ 
    if(!is_file($dir.DS.$file)){ continue; } 
    $array = explode(' ', $file); 
    if(count($array)<2){ continue; } 
    $firstTwoLetters = substr($array[1], 0, 9); 
    $foldername = $firstTwoLetters; 
     if(is_dir($folders[$firstTwoLetters])||mkdir($foldername[$firstTwoLetters],0777, 1)) 
      rename($dir.DS.$file,$foldername[$firstTwoLetters].DS.$file); 

該代碼目前讀文件名,如果它已經在數組「文件夾」它移動到正確的文件夾,我最近已經改變它使文件夾自動讀取上傳部分中的任何文件,但問題出現在製作文件夾時,mkdir似乎使目錄:

1)在錯誤的地方,它使代碼存儲在com_upload部分的位置,而不是在上傳文件夾中。 2)將它命名錯誤,它需要第一個字母而不是後面的字母或數字。例如。 「2014-04-08 NS6565.doc」,使目錄「N」

任何幫助解決這兩個問題將是很大的。

感謝,

+0

'$ firstTwoLetters = SUBSTR($陣列[1],0,9); '永遠不會返回2個字符。 'substr'需要(字符串,起始點,長度)。看看[手冊](http://nl1.php.net/manual/en/function.substr.php) – Michel 2014-11-05 12:01:42

+0

嗯它會返回9這是我想要的,因爲有所有的字母和空格後的數字。但它會創建文件夾,但只用一個字母命名它 – Simpson 2014-11-05 12:04:06

+0

您不需要使用'/ var/www/vhosts .....'。您可以使用'JPATH_BASE',它將返回Joomla安裝的根目錄。然後你可以從那裏定義其餘的路徑,就像你爲$ dir變量所做的那樣 – Lodder 2014-11-05 12:12:44

回答

1

1)如果你想建立在另一個地方的目錄或您使用相對路徑從目錄中的代碼,或者你使用絕對路徑。 2)當你使用$ foldername創建目錄時,它不是任何目錄的名稱。它是文件的名稱。此外,可以使用它作爲當它是一個字符串數組(因此它只需要一個字符)

嘗試這種情況:

$dir = JPATH_BASE . DS . "upload"; 
$folders = array('SE528733B'=>'/var/www/vhosts/test.cariss.co.uk/httpdocs/wan/upload/528733B','SE125673B'=>'/var/www/vhosts/test.cariss.co.uk/httpdocs/wan/upload/125673B','SE3452312'=>'/var/www/vhosts/test.cariss.co.uk/httpdocs/wan/upload/3452312'); 
$files = scandir($dir); 
foreach($files AS $file){ 
    if(!is_file($dir.DS.$file)){ continue; } 
    $array = explode(' ', $file); 
    if(count($array)<2){ continue; } 
    $firstTwoLetters = substr($array[1], 0, 9); 
    $foldername = substr($firstTwoLetters,0,2); 
     if(is_dir($dir. DS . $foldername)||mkdir($dir. DS . $foldername,0777, 1)) 
      rename($dir.DS.$file,$dir . DS . $foldername . DS.$file); 
+0

非常感謝你,我已經標記爲已接受並打勾了它。謝謝 – Simpson 2014-11-05 12:12:56

+0

如果目錄已經存在,快速編輯它是不會移動的,有沒有辦法說當它讀取它並存在並仍然移動到正確的目錄 – Simpson 2014-11-05 12:14:42

+0

只需更改if條件:is_dir($ dir 。DS。$文件夾名稱)|| mkdir($ dir。DS。$ foldername,0777,1) – Serpes 2014-11-05 12:16:16