如何在 Laravel Blade 模板中显示代表文件夹结构的数组?

问题描述 投票:0回答:1

假设我有一个 PHP 数组数组,表示一个文件夹结构,如下所示:

array:5 [▼
  0 => array:2 [▼
    "size" => "9.8 MiB"
    "name" => "Game.exe"
  ]
  1 => array:2 [▼
    "size" => "3.9 MiB"
    "name" => "Launcher.exe"
  ]
  2 => array:2 [▼
    "size" => "2 MiB"
    "name" => "USRDIR/mask.mpk"
  ]
  3 => array:2 [▼
    "size" => "1 MiB"
    "name" => "USRDIR/subs.hrt"
  ]
  4 => array:2 [▼
    "size" => "10 MiB"
    "name" => "USRDIR/fullhd/footage.mkv"
  ]

我想使用无序列表的无序列表将此信息显示为 HTML 中的文件夹结构,如下所示:

    <ul class="root-folder">
        <ul class="folder"><span>FOLDERNAME</span>
            <ul class="folder"><span>FOLDERNAME</span>
                <li class="file">FILENAME</li>
            </ul>
            <li class="file">FILENAME</li>
            <li class="file">FILENAME</li>
        <ul>
        <li class="file">FILENAME</li>
        <li class="file">FILENAME</li>
    </ul>

前 2 个数组具有由字符串形成的“名称”值,格式如下:“文件名.文件扩展名”,这意味着这些是此文件夹根目录中的文件。对于这些,我只需抛出一个

<li>
元素,在主
<ul>
中显示其值。但是,第三个数组的“名称”值为“folder/filesize.fileextension”,这意味着为了直观地表示这一点,我必须创建一个新的
<ul>
,其中新文件作为
<li>
元素。还有一个事实是,如果所述文件夹中包含多个文件,则数组将多次命名相同的文件夹。那么最后一个数组在文件之前有 2 个文件夹。我的语法是什么样的?我是在控制器中执行此操作并将数组传递到要显示的视图,还是在 Blade 模板中仅将原始数组传递给它?

现在这就是我所拥有的,但我有点迷失了:

控制器:

    $fileArray = [];
    foreach ($files as $key => $file) {
        array_push($fileArray, $file);
        $fileArray[$key]['size'] = formatBits($file['size']);
        $fileArray[$key]['name'] = explode('/', $file['name']);
    }

    return view('single', [
        'fileArray' => $fileArray
    ]);

刀片模板:

    <ul>
        @foreach ($fileArray as $file)
            @if (count($file['name']) > 1)
                @foreach ($file['name'] as $folder)
                    @if ($folder == end($file['name']))
                    <li>
                        <span class="file-icon">🗋</span>{{ $folder }}<span class="file-size">({{ $file['size'] }})
                    </li>
                    @else 
                    <li>
                        <span class="file-icon">🗀</span>{{ $folder }}
                    </li>
                    @endif
                @endforeach
            @else
            <li>
                <span class="file-icon">🗋</span>{{ $file['name'][0] }}<span class="file-size">({{ $file['size'] }})
            </li>
            @endif
        @endforeach
    </ul>

这会为与控制器中的原始路径名字符串分离的字符串的每个实例创建一个

<li>
元素。您应该能够看到这是如何出现问题的,因为每次提到文件夹名称时它都会创建一个新的
<li>

php laravel laravel-blade
1个回答
0
投票

我有一个简短的想法:

$files = Paths::all()->toArray();//lets say you do this to have the array you told us ready

$fileArray = [];
foreach ($files as $file) {
    if(str_contains($file['name'], '/')){
        $split = explode('/', $file['name']);
        $name = last($split);
        $path = array_chunk($split, sizeof($split)-1)[0];
    }else{
        $name = $file['name'];
        $path = [];
    }
    $temp = [['name'=>$name, 'size' => formatBits($file['size'])]]; //single value in array too to ease future headaches
    while( count($path) > 0 ){
        $temp2 = [];
        $temp2[ '/'.last( $path ) ] = $temp;
        array_pop( $path );
        $temp3 = $temp2;
        $temp2 = $temp;
        $temp = $temp3;
    }
    $fileArray = array_merge_recursive($fileArray,$temp);
}

return view('single', compact('fileArray'));

这是你的控制器,但我没有时间了,抱歉:) 在刀片中,您需要检查密钥是字符串还是数字。 Number:value是文件,包含名称和大小,string:value是目录内容的另一个数组,key是目录名称。数字可以是目录名称,但前面都有斜杠。请随意调整并继续努力! 🤞

© www.soinside.com 2019 - 2024. All rights reserved.