В Bash (и ksh, zsh, тире и т. д.) вы можете использовать расширение параметра с %
, которое удалит символы из конца строки или #
, которые будут удалять символы с начала строки , Если вы используете один из этих символов, минимальная совпадающая строка будет удалена. Если вы удвоите символ, самый длинный будет удален.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
Возможно, вы сможете взорвать путь на /, а затем использовать forloop для размещения всех частей внутри другого массива.
Затем вы можете добавить if (...), если текущая папка или файл уже находится в массиве. если это правда, вы продолжаете, иначе вы добавите его в массив, а затем продолжите
if (in_array($content["ext"], array("zip"))) {
$zip = zip_open($file);
$files = array();
while ($zip_entry = zip_read($zip)) {
$zip_path = zip_entry_name($zip_entry);
$path = explode("/", $zip_path);
$path = array_filter($path);
$lastElement = end($path);
//reset pointer
$cur = &$files;
$count = count($path);
//set pointer to proper parent folder
for ($i = 0; $i < $count - 1; $i++) {
$cur = &$cur[$path[$i]];
}
//add file
$cur[] = $path[$i];
}
//delete pointer
unset($cur);
}
print_r($files);
$cur[] = $path[$i];
я получаю Fatal error: [] operator not supported for strings
– Get Off My Lawn
17 January 2015 в 15:45
$cur = $path[$i];
вместо $cur = &$cur[$path[$i]];
или вы пропустили строку $files = array();
– Weltschmerz
17 January 2015 в 20:36
$files
массив над оператором if.
– Get Off My Lawn
18 January 2015 в 03:17
if(is_array($cur))
вокруг него, то он будет работать там, где папки будут добавляться как файлы, а некоторые файлы отсутствуют.
– Get Off My Lawn
18 January 2015 в 03:22