PHP:: 从文件夹中的文件中选择性地打包 zip 存档

问题描述 投票:0回答:2

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

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

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

  • 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 等,但我陷入了困境。此外,我确信我将分隔符之前的部分作为文件名的方法已经非常复杂和过度了。

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

php arrays split zip filenames
2个回答
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://3v4l.org/5ScBG


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();
}

?>
© www.soinside.com 2019 - 2024. All rights reserved.