我正在尝试学习PHP数组并构建一个页面来展示我用物质设计师制作的3D材料。
我在互联网上搜索过,但却失去了如何最好地完成我需要的东西。
我想要实现的功能是在服务器上显示一个目录,其中包含网格系统中文件夹中的所有项目。我已经通过表单上传了我的3D材料并解压缩到类别,但无法找到如何将数组显示到网格中。
我在服务器上的文件看起来像这样,但类别可能会增长。
我使用以下代码制作文件夹目录的多个数组。
function listFolderFiles($dir)
{
$fileInfo = scandir($dir);
$allFileLists = [];
foreach ($fileInfo as $folder)
{
if ($folder !== '.' && $folder !== '..')
{
if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true)
{
// This is the asset cat folder - ceramic - fabric so on
$allFileLists[$folder] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder);
}
else
{
// This is sub folder file like image and asset
$allFileLists[$folder] = $folder;
}
}
}
return $allFileLists;
}//end listFolderFiles()
$dir = listFolderFiles('my_directory');
上面通过“var_dump($ dir);”
输出以下数组 array(17) {
["Ceramic"]=>
array(0) {
}
["Concrete - Asphalt"]=>
array(0) {
}
["Fabric"]=>
array(3) {
["Terrazzo Generator"]=>
array(2) {
["Preview.jpg"]=>
string(11) "Preview.jpg"
["concrete_terrazzo_generator.sbsar"]=>
string(33) "concrete_terrazzo_generator.sbsar"
}
["White Test"]=>
array(2) {
["image.jpg"]=>
string(9) "image.jpg"
["leather_diamond_quilt_double_stitch.sbsar"]=>
string(41) "leather_diamond_quilt_double_stitch.sbsar"
}
["White Test2"]=>
array(2) {
["image.jpg"]=>
string(9) "image.jpg"
["leather_diamond_quilt_double_stitch.sbsar"]=>
string(41) "leather_diamond_quilt_double_stitch.sbsar"
}
}
["Ground"]=>
array(0) {
}
["Leather"]=>
array(0) {
}
["Marble - Granite"]=>
array(0) {
}
["Metal"]=>
array(0) {
}
["Organic"]=>
array(0) {
}
["Paint"]=>
array(0) {
}
["Paper"]=>
array(0) {
}
["Plaster"]=>
array(0) {
}
["Plastic - Rubber"]=>
array(0) {
}
["Signature"]=>
array(0) {
}
["Stone"]=>
array(0) {
}
["Terracotta"]=>
array(0) {
}
["Translucent"]=>
array(0) {
}
["Wood"]=>
array(1) {
["European Ash"]=>
array(1) {
["wood_european_ash.sbsar"]=>
string(23) "wood_european_ash.sbsar"
}
}
}
现在我想要做的是在网格系统中显示结果,以显示文件夹和类别中的图像。我有信心创建网格系统来显示内容,但我无法遍历多个阵列来创建网格系统。我需要确保类别中的任何空文件夹都不会显示在网格中,只显示里面的子文件夹。
如上所述,[wood]& [fabric]包含子文件夹。订购无关紧要,因为我将使用jQuery在页面上搜索或过滤。
网格系统
我可能做错了,但这是我目前唯一可以提出的方法。
任何可以帮助我过滤阵列系统的帮助都会感激不尽!
由于
答案 0 :(得分:0)
按目前使用目录和文件通常是繁琐的。理想情况下,您将数据映射到数据库中,因此您可以引用其中的每个目录和数据。上传图像时,表格字段将具有真值等。
但是,使用遍历目录结构,您可以更改数组的结构,以便访问更方便的标识符(键)并在数组中使用非空目录。如:
[0]
[
'category' => 'Ceramic',
'name' => 'white test',
'imageName' => 'Preview.jpg',
],
[1]
[
'category' => 'whatever',
'name' => 'something',
'imageName' => 'image.jpg',
],
注意没有“Concrete - Asphalt”,因为如果没有文件在数组中没有它,那么你可以循环数组,知道它应该有数据。
如果由于某种原因需要dir名称,请使用dir为空的标识符,例如:
[0]
[
'category' => 'Ceramic',
'name' => 'white test',
'imageName' => 'Preview.jpg',
'hasValues' = true,
],
[1]
[
'category' => 'Concrete - Asphalt',
'hasValues' = false,
],
然后你可以检查hasValues
是否为真等。
这是一个可能有帮助的快速脚本,将获得该阵列设置。可能有一种更清洁的方式,但是没有DB,这是相当不错的imo
function getAllFromDir($dirToSearch)
{
return new FilesystemIterator($dirToSearch, FilesystemIterator::SKIP_DOTS);
}
function listFolderFiles($dirToSearch)
{
$allFileLists = [];
$allDirs = getAllFromDir($dirToSearch);
$newKey = 0;
$imageTypes = ['jpg', 'jpeg', 'png'];
foreach ($allDirs as $dir) {
$allFileLists[$newKey]['category'] = (string) $dir->getFilename();
$parentSubDir = getAllFromDir($dir);
if (iterator_count($parentSubDir) < 1) {
$allFileLists[$newKey]['hasFiles'] = false;
$newKey++;
continue;
}
foreach ($parentSubDir as $subDir) {
$allFileLists[$newKey]['name'] = (string) $subDir->getFilename();
$files = getAllFromDir($subDir);
foreach ($files as $file) {
$ext = (string) $file->getExtension();
$keyName = in_array($ext, $imageTypes) ? 'image' : $ext;
$allFileLists[$newKey][$keyName] = (string) $file->getFilename();
}
$allFileLists[$newKey]['hasFiles'] = true;
$newKey++;
}
}
return $allFileLists;
}
对于DIR结构:
[dir] concrete
[dir] fabric
[dir] white test2
[file] image.jpg
[file] testfile.sbsar
然后上面的脚本将输出以下内容:
(
[0] => Array
(
[category] => fabric
[name] => white test2
[image] => image.jpg
[sbsar] => testfile.sbsar
[hasFiles] => true
)
[1] => Array
(
[category] => concrete
[hasFiles] => false
)
)