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