【问题标题】:PHP complex multi arrays sorting and filtering resultsPHP复杂多数组排序过滤结果
【发布时间】:2018-10-20 02:43:12
【问题描述】:

我正在尝试学习 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

我可能做错了,但这是我目前能想到的唯一方法。

您能给我的任何帮助以使我能够过滤阵列系统将不胜感激!

谢谢

【问题讨论】:

  • 给出你预期输出的样本

标签: php arrays sorting directory


【解决方案1】:

按原样处理目录和文件通常很麻烦。理想情况下,您会将数据映射到数据库中,因此您可以引用其中的每个目录和数据。上传图片时,表格字段会有真值等。

但是,使用遍历目录结构,因为这是您所拥有的,您可以更改数组的结构,以便您可以访问更方便的标识符(键)并在数组中具有非空目录。如:

[0]
    [
        'category' => 'Ceramic',
        'name' => 'white test',
        'imageName' => 'Preview.jpg',
    ],
[1]
    [
        'category' => 'whatever',
        'name' => 'something',
        'imageName' => 'image.jpg',
    ],

请注意没有“混凝土 - 沥青”,因为如果没有文件,则数组中没有它,那么您可以只循环数组,知道它应该有数据。

如果您出于某种原因需要目录名称,请提供目录为空的标识符,例如:

[0]
    [
        'category' => 'Ceramic',
        'name' => 'white test',
        'imageName' => 'Preview.jpg',
        'hasValues' = true,
    ],
[1]
    [
        'category' => 'Concrete - Asphalt',
        'hasValues' = false,
    ],

然后你可以检查hasValues是否为真等等。

 

这里有一个可能会有所帮助的快速脚本,它将获得该阵列设置。可能有一种更清洁的方法,但鉴于没有数据库,这是相当不错的 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
        )

)

【讨论】:

  • 感谢@james,它有点用,输出如你上面所说,但它没有输出所有项目或类别。
  • 我找到了为什么这些项目没有全部显示。 $新键++;应该在 $allFileLists[$newKey]['hasFiles'] = true;而不是在foreach之外。而在 $allFileLists[$newKey]['hasFiles'] = false;还显示所有没有项目的文件夹,而不仅仅是一个。谢谢您的帮助!如果您可以编辑上面的代码,我会投票赞成 :-).. 再次感谢
  • 我会更改它,但这是包含每个父目录的外部键。但如果它没有问题:)
  • 它的工作方式与我编辑代码的方式相同。非常感谢你让我的生活更轻松,在我发布之后,我尝试添加一些键名,但我的代码没有你做的那么先进。我现在有一个工作页面,并且能够取消设置没有项目的目录,使其更流畅!干杯詹姆斯你的明星!
  • 没问题。很高兴帮助:)
猜你喜欢
  • 2014-09-11
  • 2011-06-27
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多