PHP复杂多数组排序和过滤结果

时间:2018-05-09 21:48:50

标签: php arrays sorting directory

我正在尝试学习PHP数组并构建一个页面来展示我用物质设计师制作的3D材料。

我在互联网上搜索过,但却失去了如何最好地完成我需要的东西。

我想要实现的功能是在服务器上显示一个目录,其中包含网格系统中文件夹中的所有项目。我已经通过表单上传了我的3D材料并解压缩到类别,但无法找到如何将数组显示到网格中。

我在服务器上的文件看起来像这样,但类别可能会增长。

Folders on server

我使用以下代码制作文件夹目录的多个数组。

    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在页面上搜索或过滤。

网格系统

enter image description here

我可能做错了,但这是我目前唯一可以提出的方法。

任何可以帮助我过滤阵列系统的帮助都会感激不尽!

由于

1 个答案:

答案 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
        )

)