[英]Php RecursiveIteratorIterator through tarball keeping original file order
在 tarball 文件中,文件按被推入的時間排序。在下面的示例中,它們不是按字母順序排序,而是按推入順序排序。
# tar tvf file.tgz
-rw-r--r-- 0/0 962 2023-01-17 13:40:17 6fe3b8b5-a4dc-4976-bea9-227434c11cda
-rw-r--r-- 0/0 962 2023-01-17 13:40:17 febe009e-8ce0-4027-abda-e27f5f949dde
-rw-r--r-- 0/0 962 2023-01-17 13:40:17 4fea07a6-a90c-4cb4-9969-4cac08422ccf
-rw-r--r-- 0/0 962 2023-01-17 13:40:17 01610297-c577-4e6c-9ce9-7825a40e6d0c
-rw-r--r-- 0/0 962 2023-01-17 13:40:26 01b498ca-3d87-426b-b01d-d4e75921cb00
-rw-r--r-- 0/0 962 2023-01-17 13:40:26 45821111-f69d-4331-87d8-f3afd9918c91
令人驚訝的是,當使用 PHP 8.1 RecursiveIteratorIterator
閱讀上面的 tarball 時,它們是按字母順序迭代的。
$p = new PharData($path);
foreach (new RecursiveIteratorIterator($p) as $file) {
echo $file . "\n";
}
上面的代碼導致下面的 output:
phar:///path/to/file/01610297-c577-4e6c-9ce9-7825a40e6d0c
phar:///path/to/file/01b498ca-3d87-426b-b01d-d4e75921cb00
phar:///path/to/file/45821111-f69d-4331-87d8-f3afd9918c91
phar:///path/to/file/4fea07a6-a90c-4cb4-9969-4cac08422ccf
phar:///path/to/file/6fe3b8b5-a4dc-4976-bea9-227434c11cda
phar:///path/to/file/febe009e-8ce0-4027-abda-e27f5f949dde
PHP 中有沒有一種方法可以按原始順序迭代 tarball 內容?
我相信這是由PharData
class 而不是RecursiveIteratorIterator
引起的。 您可以通過首先轉換為數組,然后在您想要的任何字段上使用usort()
來強制進行自己的排序:
$p = new PharData(...);
$files = iterator_to_array($p);
usort($files, fn($a, $b) => $a->getMTime() <=> $b->getMTime());
foreach ($files as $file) {
printf("%s %s\n", $file->getPathname(), $file->getMTime());
}
感謝 Alex Howansky 的回答,我找到了一個基於exec()的有效解決方案,它基本上利用了 tar 排序列表:
$sortedFileList = [];
exec("tar tf $path", $sortedFileList);
$sortedFileList = array_flip($sortedFileList);
$p = new PharData($path);
$files = iterator_to_array($p);
usort($files,
fn(a, $b) => $sortedFileList[$a->getFilename()] <=> $sortedFileList[$b->getFilename()]
);
foreach ($files as $file) {
printf("%s %s\n", $file->getPathname(), $file->getMTime());
}
我不太喜歡使用 exec,但實現我的目標的唯一替代方法是向項目添加一些外部庫,並且由於這項工作應該由普通的PharData迭代器完成,我希望將來它會允許以原始順序迭代 tarball 文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.