I have some file list arrays with elements exceeding 100s in number that I need to convert to a tree array and insert them into the database and return the tree on call for a json api directory system I have spent a week trying different algorithms, all of them fail at some point. This is the array:
$files[] = array('dir1/dir2/dir3/file1.mkv', 44444);
$files[] = array('dir1/dir2/dir3/file2.mkv', 44444);
$files[] = array('dir1/dir2/file1.mkv', 44444);
$files[] = array('dir1/dir2/file2.txt', 11111);
$files[] = array('dir1/file1.exe', 22222);
$files[] = array('dir1/file2.exe', 22222);
$files[] = array('file1.rar', 3333);
the first element is the file path, second element is filesize. These files dont exist on this server, they are on a different server, this is the api server. I need to convert it into a nested tree array like this:
Array
(
[dir1] => Array
(
[dir2] => Array
(
[dir3] => Array
(
[0] => Array
(
[name] => file1.mkv
[size] => 44444
)
[1] => Array
(
[name] => file2.mkv
[size] => 44444
)
)
[0] => Array
(
[name] => file1.mkv
[size] => 44444
)
[1] => Array
(
[name] => file2.txt
[size] => 11111
)
)
[0] => Array
(
[name] => file1.exe
[size] => 22222
)
[1] => Array
(
[name] => file2.exe
[size] => 22222
)
)
[0] => Array
(
[name] => file1.rar
[size] => 3333
)
)
I wrote some code but it only goes up to 2nd level (dir2), then on the third level (dir3), it fails to perform as expected.
the code:
foreach ($files as $file)
{
$info = pathinfo($file[0]);
if ($info['dirname'] != '.')
{
if (strpos($info['dirname'], '/') !== false)
{
$dirs[pathinfo($info['dirname'])['dirname']][pathinfo($info['dirname'])['basename']][] = array('name' => $info['basename'], 'size' => $file[1]);
}
else
{
$dirs[$info['dirname']][] = array('name' => $info['basename'], 'size' => $file[1]);
}
}
else
{
$dirs[] = array('name' => $info['basename'], 'size' => $file[1]);
}
}
This code returns the array fine if I remove the dir3 level from the file list array, but with the dir3 present, it gives:
Array
(
[dir1/dir2] => Array
(
[dir3] => Array
(
[0] => Array
(
[name] => file1.mkv
[size] => 44444
)
[1] => Array
(
[name] => file2.mkv
[size] => 44444
)
)
)
[dir1] => Array
(
[dir2] => Array
(
[0] => Array
(
[name] => file1.mkv
[size] => 44444
)
[1] => Array
(
[name] => file2.txt
[size] => 11111
)
)
[0] => Array
(
[name] => file1.exe
[size] => 22222
)
[1] => Array
(
[name] => file2.exe
[size] => 22222
)
)
[0] => Array
(
[name] => file1.rar
[size] => 3333
)
)
This [dir1/dir2] is the problem, I need it to be a perfect tree so I can recurs through it and insert the records into the database.