Каталог итератор в пользовательский массив

Я пытаюсь сделать это для JSTree

[
{"id":2,"text":"Child node 1"},
{"id":3,"text":"Child node 2"},
{
"text" : "Root node",
"state" : { "opened" : true },
"children" : [
{
"text" : "Child node 1",
"state" : { "selected" : true },
"icon" : "jstree-file"},
{ "text" : "Child node 222", "state" : { "disabled" : true } }
]
}
]

Я пытаюсь создать это с помощью DirectoryIterator

Я получил следующее от сайта php

   $ritit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), FilesystemIterator::SKIP_DOTS);
$r = array();
foreach ($ritit as $splFileInfo) {


$path = $splFileInfo->isDir()
? array($splFileInfo->getFilename() => array())
: array($splFileInfo->getFilename());

for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) {
$path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
}

$r = array_merge_recursive($r, $path);

}

Это выводы

массив
(
[.] => Массив
(
)

[..] => Array
(
)

[0] => Christmas.docx
[test1] => Array
(
)

[test2] => Array
(
)
)

Я попытался изменить это к этому

$k = array();
foreach ($ritit as $splFileInfo) {
//skip if its '.' or '..'
if ($splFileInfo->getFilename() === '.' || $splFileInfo->getFilename() === '..') {
continue;
}

//if is dir
if($splFileInfo->isDir()) {

$path[] = array("text" => $splFileInfo->getFilename(), "children" => array()) ;

} else {
$path[] = array("text" => $splFileInfo->getFilename());

}

for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) {
$path["children"] = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
}

$k = array_merge_recursive($k, $path);

}

И это выводы

Array
(
[test2] => Array
(
)

[0] => Array
(
[text] => Christmas.docx
)

[1] => Array
(
[text] => Christmas.docx
)

[2] => Array
(
[text] => test1
[children] => Array
(
)

)

[3] => Array
(
[text] => Christmas.docx
)

[4] => Array
(
[text] => test1
[children] => Array
(
)

)

[5] => Array
(
[text] => test2
[children] => Array
(
)

)

)

Пожалуйста, не могли бы вы помочь мне с тем, что я собираюсь сделать, чтобы перебрать структуру файла и вернуть массив, который я могу преобразовать в json в начале поста?


Обновить

кредит для: https://stackoverflow.com/a/3556894/1842842

У меня есть это сейчас:

function requestAccountFolderStructure($dir) {
$list = array();
$path = $dir;
$i = 0;
foreach (new DirectoryIterator($path) as $file) {
if ($file->isDot())
continue;

if ($file->isDir()) {
$record = array();
$record['id'] =  $i;
$record['text'] =  $file->getFilename();
$record['children'] = array();
$record['path'] = $file->getPathInfo()->getFilename();
if (is_dir($dir . '/' . $file)) {
$record['children'] = requestAccountFolderStructure($dir . '/' . $file);
}
$list[] = $record;
$i++;
}

}
return $list;
}

$dir = 'folder/';
$directories = requestAccountFolderStructure($dir);

foreach($directories as $directory){
//if(count($directory['children'] === 1)){
$dir = new DirectoryIterator('folder/' . $directory['text']);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDir()) {
$directories[$directory['id']]['children'][] = array("text" => $fileinfo->getFilename(),"icon" => "jstree-file" );
}
}
//}
}

print_r(json_encode($directories));

Который производит для меня

[{"id":0,"text":"test1","children":[{"text":"1.docx","icon":"jstree-file"}],"path":"folder"},{"id":1,"text":"test2","children":[{"id":0,"text":"New folder","children":[],"path":"test2"},{"text":"2.txt","icon":"jstree-file"}],"path":"folder"}]

мне просто нужно выяснить, сделать это итеративно в подпапках сейчас

1

Решение

кредит: https://stackoverflow.com/a/952324/1842842

Этот код

$fileData = convertDirectoryToArray( new DirectoryIterator( 'folder/' ) );

function convertDirectoryToArray( DirectoryIterator $dir )
{
$data = array();
foreach ( $dir as $node )
{
if ( $node->isDir() && !$node->isDot() )
{
$test = array();
$test['text'] = $node->getFilename();
$test['children'] = convertDirectoryToArray( new DirectoryIterator( $node->getPathname() ) );

$data[] = $test;
}
else if ( $node->isFile() )
{
$test= array();
$test['text'] = $node->getFilename();
$test['icon'] = "jstree-file";
$data[] = $test;
}
}
return $data;
}

print_r(json_encode($fileData));

производит

[{"text":"Christmas.docx"},{"text":"test1","children":[{"text":"1.docx"}]},{"text":"test2","children":[{"text":"2.txt"},{"text":"New folder","children":[{"text":"4.txt"}]}]}]

Что я и искал!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]