2014-11-05 154 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