PHP ::从文件夹中的文件中选择性地打包zip-archives

时间:2015-06-30 11:37:18

标签: php arrays split zip filenames

我有一个包含几百个文件的文件夹。 文件名总是类似于###### _ ### - #######。ext它们的共同点是分隔符" - "。在分隔符之前具有相同名称的文件应被视为同一文章组。

我想要实现的是运行一个扫描整个文件夹并从这些文件创建zip压缩文件的php文件。每个存档应包含一个文章组中的所有文件,并在分隔符之前命名为文件名,以了解其内容。

示例(文件名;是的,它们可能有空格):

  • Article_1 - 子类型a.ext
  • Article_1 - 子类型b.ext
  • Article_2 - 子类型a.ext
  • Article_2 - 子类型b.ext
  • Article_2 - 子类型c.ext

运行该过程后,应该有2个档案(在这种情况下)。一个名为Article_1.zip,包含前两个文件,因为它们组成一个组。第二个文件包含剩余的三个文件,并命名为Article_2.zip,因为它们组成一个组。

我使用array_count_values,array_key_exists等更多时间摆弄了半天,但我还是坚持了这一点。除此之外,我确信我将分隔符之前的部分作为文件名的方法已经变得复杂和过度了。

我非常感谢任何帮助! :)

2 个答案:

答案 0 :(得分:1)

根据文章名称分隔文件的PHP代码如下: -

<?php
$array = Array('Article_1 - Subtype a.ext','Article_1 - Subtype b.ext','Article_2 - Subtype a.ext','Article_2 - Subtype b.ext','Article_2 - Subtype c.ext');
$new_array = array(); 
foreach($array as $arr) { 
    $exploded_array = explode("-", $arr); 
    $new_array[$exploded_array[0]][] = $arr; 
}
echo "<pre/>";
print_r($new_array);
?>

输出: - https://eval.in/389841

答案 1 :(得分:1)

再次感谢。发布完成诀窍的最终代码: (MV是存储要打包的文件的子文件夹)     

$files = scandir('MV/');
$arr2 = array();

foreach($files as $arr) 
{ 
    $exploded_array = explode(" - ", $arr); 
    $arr2[$exploded_array[0]][] = $arr;
}

for($k=0;$k<count($arr2);$k++)
{
    $zip = new ZipArchive();
    $key = key($arr2); 
    $title = './'.$key.'.zip';

    if ($zip->open($title, ZipArchive::CREATE)!==TRUE) 
    {
            exit("cannot open <$filename>\n");
    }
        for($l=0;$l<count($arr2[$key]);$l++)
        {
            $zip->addFile('MV/'.$arr2[$key][$l],$arr2[$key][$l]);
        }

    next($arr2);
    echo 'The zip archive ', $title,' contains ',$zip->numFiles,' files.';
    echo '<br>';
    $zip->close();
}

?>