Отображение массива как древовидной структуры в php

У меня есть массив:

Array ( [0] => dir0|file0.txt [1] => dir0|file1.txt [2] => dir1|file2.txt [3] => dir1|filea.txt [4] => dir2|fileb.txt ) 

Я бы хотел, чтобы он отображался как дерево, например:

 dir0 file0.txt file1.txt dir1 file2.txt filea.txt dir2 fileb.txt 

Может ли кто-нибудь объяснить, как я могу это сделать?

Изменить: обновлено для многомерного массива:

 $paths[0][0] = 'dir0|file0.txt'; $paths[0][1] = 400; $paths[1][0] = 'dir0|filea.txt'; $paths[1][1] = 500; $paths[2][0] = 'dir1|file1.txt'; $paths[2][1] = 600; $paths[3][0] = 'dir1|fileb.txt'; $paths[3][1] = 700; $paths[4][0] = 'dir2|filec.txt'; $paths[4][1] = 700; 

Я хотел бы, чтобы результат был следующим:

 dir0 (900) file0.txt (400) filea.txt (500) dir1 (1300) file1.txt(600) fileb.txt (700) dir2 (700) filec.txt (700) 

Значения должны быть добавлены и отображены в корне.

Related of "Отображение массива как древовидной структуры в php"

Лучшим способом было бы переформатировать массив, поэтому ключи были каталогами, а значениями массива были массивы, содержащие имена файлов, например:

 $array = array( ..); $reformatted = array(); foreach( $array as $k => $v) { list( $key, $value) = explode( '|', $v); if( !isset( $reformatted[$key])) $reformatted[$key] = array(); $reformatted[$key][] = $value; } 

Тогда вам просто нужно перебирать новый массив, например:

 foreach( $reformatted as $dir => $files) { echo $dir . "\n"; foreach( $files as $file) echo "\t" . $file . "\n"; } 

Эти результаты :

 dir0 file0.txt file1.txt dir1 file2.txt filea.txt dir2 fileb.txt 

Обратите внимание, что это будет работать только в среде обычного текста (например, <pre></pre> , как в демонстрации). В противном случае вам нужно будет использовать <br /> вместо \n для разрывов строк или использовать упорядоченный или неупорядоченный список.

Для вывода HTML используйте это, выход которого можно увидеть здесь

 echo '<ul>'; foreach( $reformatted as $dir => $files) { echo "<li>$dir</li>"; echo '<ul>'; foreach( $files as $file) echo "<li>$file</li>"; echo '</ul>'; } echo '</ul>'; 

Формирует:

  • dir0
  • File0.txt
  • file1.txt
  • dir1
    • file2.txt
    • filea.txt
  • dir2
    • fileb.txt

    Для вашего обновленного массива, вот решение:

     $reformatted = array(); $weights = array(); foreach( $paths as $k => $v) { list( $key, $value) = explode( '|', $v[0]); if( !isset( $reformatted[$key])) $reformatted[$key] = array(); if( !isset( $weights[$key])) $weights[$key] = 0; $reformatted[$key][] = array( $value, $v[1]); $weights[$key] += $v[1]; } foreach( $reformatted as $dir => $files) { echo $dir . ' (' . $weights[$dir] . ")\n"; foreach( $files as $file) echo "\t" . $file[0] . ' (' . $file[1] . ")\n"; } 

    Эти результаты :

     dir0 (900) file0.txt (400) filea.txt (500) dir1 (1300) file1.txt (600) fileb.txt (700) dir2 (700) filec.txt (700) 

    Я оставлю это для вас, чтобы перевести это в HTML, если это необходимо.

    Вы хотите использовать цикл и сделать это.

      <?php $directories = array(); foreach($arr as $val) { $pair = explode('|', $val); if(!isset($directories[$pair[0]])) { $directories[$pair[0]] = array(); } $directories[$pair[0]][] = $pair[1]; } print_r($directories); 

    Это приведет к реорганизации вашего массива, а затем print_r it, показывая вам новую структуру. Тогда вы можете сделать это:

      <?php foreach($directories as $directory => $files) { echo "$directory<br><ul>"; foreach($files as $file) { echo "<li>$file</li>"; } echo "</ul>"; }