open($src); if ($res === TRUE) { if ($skipdirs) { $tmpdir = tempnam(sys_get_temp_dir(), 'phpinstaller-') . '.ext'; mkdir($tmpdir, 0700); mkdir($dest); $zip->extractTo($tmpdir); for($i = 0; $i < $zip->numFiles; $i++){ $name = $srcname = $zip->getNameIndex($i); $parts = array(); while ($name && $name != '.' && $name != '/') { array_unshift($parts, basename($name)); $name = dirname($name); } if ($subdir) { // We only need to move the level after the level after the skipdirs level, presuming that level after the skipdirs level == $subdir if (count($parts) != $skipdirs+2) continue; if ($parts[$skipdirs] != $subdir) continue; $dstname = $parts[$skipdirs+1]; } else { // We only need to move the very next level after the skipdirs level if (count($parts) != $skipdirs+1) continue; $dstname = $parts[$skipdirs]; } rename($tmpdir.'/'.$srcname, $dest.'/'.$dstname); } } else { $zip->extractTo($dest); } $zip->close(); } else { throw new Exception('Could not extract zip at '.$src.' to '.$dest); } } }