Zip entry name: примеры (PHP)

Функция zip_entry_name: обработка архивов в PHP
Раздел: Архивация
zip_entry_name(resource zip_entry): string

Описание функции zip_entry_name

Функция zip_entry_name() в PHP предназначена для получения имени записи (файла или директории) внутри ZIP-архива. Она используется при работе с ZIP-архивами в процедурном стиле, когда требуется прочитать содержимое архива без его полного распаковки.

Функция вызывается в процессе итерации по элементам архива после открытия архива функцией zip_open() и чтения записей с помощью zip_read().

Аргументы функции
  • zip_entry (ресурс) — обязательный аргумент. Дескриптор записи ZIP, полученный с помощью функции zip_read(). Представляет собой ресурс, указывающий на конкретный элемент внутри открытого ZIP-архива.

Функция возвращает строку с именем записи или false в случае возникновения ошибки.

Примеры использования zip_entry_name

Базовый пример чтения архива

Получение имен всех элементов в ZIP-архиве:

$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        echo zip_entry_name($entry) . "\n";
    }
    zip_close($zip);
} else {
    echo "Не удалось открыть архив";
}
documents/report.pdf
documents/invoice.docx
images/photo.jpg
Пример с проверкой типа элемента

Определение, является ли запись директорией:

$zip = zip_open('archive.zip');
if ($zip) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        if (substr($name, -1) === '/') {
            echo "Директория: $name\n";
        } else {
            echo "Файл: $name\n";
        }
    }
    zip_close($zip);
}
Директория: documents/
Файл: documents/report.pdf
Директория: images/
Файл: images/photo.jpg

Альтернативы в PHP

Класс ZipArchive

Объектно-ориентированный интерфейс для работы с ZIP-архивами, более современный и функциональный.

$zip = new ZipArchive();
if ($zip->open('archive.zip') === TRUE) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        echo $zip->getNameIndex($i) . "\n";
    }
    $zip->close();
}
Сравнение подходов
  • ZipArchive рекомендуется для новых проектов, предоставляет больше методов и лучше интегрируется с современным PHP.
  • zip_entry_name() и другие процедурные функции могут использоваться для простых задач или в legacy-коде.
  • Класс ZipArchive поддерживает дополнительные возможности: добавление файлов, шифрование, работу с потоками.

Аналоги в других языках

Python (модуль zipfile)
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zf:
    for name in zf.namelist():
        print(name)
documents/report.pdf
documents/invoice.docx
images/photo.jpg
JavaScript (Node.js с библиотекой adm-zip)
const AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
const entries = zip.getEntries();
entries.forEach(entry => {
    console.log(entry.entryName);
});
Особенности
  • В Python используется объектно-ориентированный подход с методом namelist().
  • В JavaScript требуется установка дополнительных библиотек, так как нет встроенной поддержки ZIP.
  • PHP предлагает два подхода (процедурный и ООП), что обеспечивает гибкость.

Типичные ошибки

Передача неверного типа аргумента
$result = zip_entry_name('not_a_resource');
var_dump($result);
Warning: zip_entry_name() expects parameter 1 to be resource, string given
bool(false)
Использование после закрытия архива
$zip = zip_open('archive.zip');
$entry = zip_read($zip);
zip_close($zip);
$name = zip_entry_name($entry);
var_dump($name);
Warning: zip_entry_name(): supplied resource is not a valid Zip Entry resource
bool(false)
Отсутствие файла архива
$zip = zip_open('nonexistent.zip');
if (!is_resource($zip)) {
    echo "Архив не найден или поврежден";
}
Архив не найден или поврежден

Изменения в версиях PHP

  • В PHP 8.0.0 процедурный API ZIP (включая zip_entry_name()) перемещен в расширение zip, которое должно быть явно установлено через PECL.
  • В PHP 8.0.0 параметр zip_entry теперь ожидает ресурс типа ZipEntry вместо обычного ресурса.
  • Расширение zip (процедурное API) больше не включается по умолчанию в стандартные сборки PHP начиная с версии 8.0.0.

Расширенные примеры

Фильтрация файлов по расширению
Пример php
function getFilesByExtension($zipPath, $extension) {
    $result = [];
    $zip = zip_open($zipPath);
    if (!is_resource($zip)) return $result;
    
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        if (pathinfo($name, PATHINFO_EXTENSION) === $extension) {
            $result[] = $name;
        }
    }
    zip_close($zip);
    return $result;
}

$pdfFiles = getFilesByExtension('documents.zip', 'pdf');
print_r($pdfFiles);
Array
(
    [0] => files/document1.pdf
    [1] => files/report.pdf
)
Рекурсивный обход с сохранением структуры
Пример php
function extractZipStructure($zipPath) {
    $structure = [];
    $zip = zip_open($zipPath);
    if (!is_resource($zip)) return $structure;
    
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        $parts = explode('/', $name);
        $current = &$structure;
        
        foreach ($parts as $part) {
            if (!empty($part)) {
                if (!isset($current[$part])) {
                    $current[$part] = [];
                }
                $current = &$current[$part];
            }
        }
    }
    zip_close($zip);
    return $structure;
}

print_r(extractZipStructure('project.zip'));
Array
(
    [src] => Array
        (
            [classes] => Array
                ( [] => [] )
            [config] => Array
                ( [] => [] )
        )
    [public] => Array
        (
            [index.php] => Array
                ( [] => [] )
        )
)
Обработка вложенных архивов
Пример php
function listNestedArchives($zipPath) {
    $nested = [];
    $zip = zip_open($zipPath);
    if (!is_resource($zip)) return $nested;
    
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        $ext = pathinfo($name, PATHINFO_EXTENSION);
        
        if (in_array($ext, ['zip', 'rar', '7z'])) {
            $nested[] = $name;
        }
    }
    zip_close($zip);
    return $nested;
}

PHP zip_entry_name function comments

En
Zip entry name Retrieve the name of a directory entry