如何用PHP ZipArchive仅列出压缩包的一级文件与文件夹?
问题
我有一个wp.zip压缩包,希望仅列出其中的一级文件和文件夹。当前使用的代码如下:
$zip = new \ZipArchive(); $zip->open('wp.zip'), \ZipArchive::RDONLY); for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); echo $stat['name'] . ' '; }
该代码会递归输出所有文件,而我需要的仅为一级内容,示例如下:
wp-admin/ wp-content/ index.php config.php <...>
请问实现该需求的最优方法是什么?
解决方案
先修正你代码里的语法错误:open方法的括号位置错误,正确调用应为$zip->open('wp.zip', \ZipArchive::RDONLY);。
要只输出压缩包的一级内容,核心是筛选根目录下的条目——路径要么不含斜杠(一级文件),要么斜杠仅出现在末尾(一级文件夹)。同时注意:压缩包内的子文件会携带父文件夹路径(比如wp-admin/index.php),这会导致父文件夹被重复匹配,必须做去重处理。
直接使用以下代码即可实现需求:
$zip = new \ZipArchive(); if ($zip->open('wp.zip', \ZipArchive::RDONLY) === true) { $rootEntries = []; for ($i = 0; $i < $zip->numFiles; $i++) { $entryName = $zip->statIndex($i)['name']; $slashPos = strpos($entryName, '/'); // 跳过开头带斜杠的异常路径 if ($slashPos === 0) continue; if ($slashPos === false) { // 无斜杠,判定为一级文件 $rootEntries[$entryName] = $entryName; } elseif ($slashPos === strlen($entryName) - 1) { // 斜杠在末尾,判定为一级文件夹,用无斜杠的名称作为键去重 $folderName = substr($entryName, 0, -1); $rootEntries[$folderName] = $entryName; } } // 输出去重后的一级内容 foreach ($rootEntries as $entry) { echo $entry . PHP_EOL; } $zip->close(); } else { echo '无法打开wp.zip压缩包'; }
关键细节
- 利用数组键的唯一性自动去重,避免同一个一级文件夹被多次匹配
- 精准判断路径结构:区分一级文件、一级文件夹,跳过异常格式的路径
- 增加压缩包打开失败的错误提示,提升代码健壮性
内容的提问来源于stack exchange,提问作者Roman01
相关产品推荐
相关产品推荐

