У меня есть массив строк файла-пути, подобных этому
Конечная цель – получить их в jsTree. Я построил прототип дерева из вышеприведенных строк. проверьте это: http://jsfiddle.net/ecropolis/pAqas/
Во-первых, я бы создал рекурсивную функцию для итерации через ваш каталог в массив
function ReadFolderDirectory($dir,$listDir= array()) { $listDir = array(); if($handler = opendir($dir)) { while (($sub = readdir($handler)) !== FALSE) { if ($sub != "." && $sub != ".." && $sub != "Thumb.db") { if(is_file($dir."/".$sub)) { $listDir[] = $sub; }elseif(is_dir($dir."/".$sub)) { $listDir[$sub] = $this->ReadFolderDirectory($dir."/".$sub); } } } closedir($handler); } return $listDir; }
а затем вывести массив с помощью json_encode
.
Источник, используемый с: http://www.php.net/manual/en/function.readdir.php#87733
Я смог использовать это превосходное решение (нижняя часть, отправленное @Casablanca) для обработки указанных строк в рекурсивную структуру массива. Преобразование массива путей в список UL
<?php $paths = array('videos/funny/jelloman.wmv','videos/funny/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv', 'jimmy.wmv','herman.wmv'); sort($paths); $array = array(); foreach ($paths as $path) { $path = trim($path, '/'); $list = explode('/', $path); $n = count($list); $arrayRef = &$array; // start from the root for ($i = 0; $i < $n; $i++) { $key = $list[$i]; $arrayRef = &$arrayRef[$key]; // index into the next level } } function buildUL($array, $prefix,$firstrun) { $c = count($array); foreach ($array as $key => $value) { $path_parts = pathinfo($key); if($path_parts['extension'] != '') { $extension = $path_parts['extension']; } else { $extension = 'folder'; } if ($prefix == '') { //its a folder echo ' { "data":"'.$key.'"'; } else { //its a file echo '{"data" : {"title":"'.$key.'"},"attr":{"href": "'.$prefix.$key.'","id": "1239"}, "icon": "images\/'.$extension.'-icon.gif"'; } // if the value is another array, recursively build the list$key if (is_array($value)) { echo ',"children" : [ '; buildUL($value, "$prefix$key/",false); } echo "}"; $c = $c-1; if($c != 0) { echo ","; } } //end foreach if($firstrun != true) echo "]"; } echo '{ "data" : ['; buildUL($array, '',true); echo '] }'; ?>
Я исправил ответ конкатенации, выбранный @Ecropolis, для использования массивов. Его первоначальный пример помог мне, но я согласен с @RobertPitt, что мне нужен json_encode, чтобы действительно быть хорошим решением.
$filesArray = array('videos/funny/jelloman.wmv','videos/funny/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv', 'jimmy.wmv','herman.wmv'); $finalTree = $this->parseArrayToTree($filesArray); $finalJsonTree = json_encode($finalTree); function parseArrayToTree($paths) { sort($paths); $array = array(); foreach ($paths as $path) { $path = trim($path, '/'); $list = explode('/', $path); $n = count($list); $arrayRef = &$array; // start from the root for ($i = 0; $i < $n; $i++) { $key = $list[$i]; $arrayRef = &$arrayRef[$key]; // index into the next level } } $dataArray = array(); $dataArray['data'] = array(); $dataArray['data'] = $this->buildUL($array, ''); return $dataArray; } function buildUL($array, $prefix) { $finalArray = array(); foreach ($array as $key => $value) { $levelArray = array(); $path_parts = pathinfo($key); if (!empty($path_parts['extension']) && $path_parts['extension'] != '') { $extension = $path_parts['extension']; } else { if (empty($value)) { $extension = ""; } else if (is_array($value)) { $extension = 'folder'; } } if (is_array($value)) { //its a folder $levelArray['data'] = $key; } else { //its a file $levelArray['data']['title'] = $key; $levelArray['attr']['href'] = $prefix . $key; $levelArray['attr']['id'] = $prefix . $key; $levelArray['icon'] = "images/" . $extension . "-icon.gif"; } // if the value is another array, recursively build the list$key if (is_array($value)) { $levelArray['children'] = $this->buildUL($value, $prefix . $key . "/"); } $finalArray[] = $levelArray; } //end foreach return $finalArray; }