Intereting Posts
Как динамически генерировать ключ клиента openvpn с помощью php и передавать переменные команде shell? CRC32 От C ++ / C # до PHP Как загрузить путь и имя изображения в базу данных – Codeigniter Почему 65.6 * 100% 10 равно 9, вместо 0 в PHP? Можно ли включить код сборки в php-скрипт? Что такое «настоящий» язык программирования? PHP tot MySQL загружает изображения не работает Использование AJAX в плагине WordPress Какой язык использовать для разбора xml для навигации Использование memcache в качестве хранилища сеансов? PHP 7 RC3: Как установить отсутствующий MySQL PDO Twilio PHP – сертификат SSL: самоподписанный сертификат в цепочке сертификатов HTML-форма PHP post для самостоятельной проверки или отправки на новую страницу Условно заданные цены на товары для определенных продуктов в WooCommerce 3 Как создать ссылку для загрузки PDF-файла, для которой не требуется щелчок правой кнопкой мыши?

Структура каталогов Parse (строки) для JSON с использованием PHP

У меня есть массив строк файла-пути, подобных этому

  • видео / смешные / jelloman.wmv
  • видео / смешные / bellydance.flv
  • видео / abc.mp4
  • видео / june.mp4
  • видео / cleaver.mp4
  • аудио / uptown.mp3
  • аудио / juicy.mp3
  • fun.wmv
  • jimmy.wmv
  • herman.wmv

Конечная цель – получить их в 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; }