PHP сложный мульти-массив сортировки и фильтрации результатов - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь изучить 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 для поиска или фильтрации на странице.

Сетка

введите описание изображения здесь

Вероятно, я все делаю неправильно, но это единственный способ, которым я могу сейчас придумать.

Буду благодарен за любую помощь в фильтрации системы массивов!

Спасибо

1 Ответ

0 голосов
/ 10 мая 2018

Игра с каталогами и файлами, какими вы есть, часто бывает сложной. В идеале данные должны отображаться в БД, поэтому у вас должны быть ссылки на каждый каталог и данные в нем. Когда вы загружаете изображение, поле таблицы будет иметь истинное значение и т. Д.

Однако, работая с обходом структуры каталогов, поскольку это то, что у вас есть, вы можете изменить структуру вашего массива, чтобы иметь доступ к более удобным идентификаторам (ключам) и иметь непустые каталоги в массиве. Такие как:

[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
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...