У меня есть массив:
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)
Значения должны быть добавлены и отображены в корне.
Лучшим способом было бы переформатировать массив, поэтому ключи были каталогами, а значениями массива были массивы, содержащие имена файлов, например:
$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>';
Формирует:
Для вашего обновленного массива, вот решение:
$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>"; }