You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:10:31