简体   繁体   English

在PHP中将数组显示为树结构

[英]Displaying array as tree structure in php

I have an array: 我有一个数组:

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

I would like it to be displayed as a tree, such as: 我希望将其显示为树,例如:

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

Can any one explain how I can do that? 谁能解释我该怎么做?

Edit: Updated for multidimentional array: 编辑:更新为多维数组:

$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;

I would like the output to be: 我希望输出为:

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

The values need to be added and displayed in root. 这些值需要添加并显示在根目录中。

The best way would be to reformat the array so the keys were the directories, and the array values were arrays containing file names, like so: 最好的方法是重新格式化数组,使键为目录,而数组值为包含文件名的数组,如下所示:

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

Then you just have to iterate over the new array, like so: 然后,您只需要遍历新数组,如下所示:

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

This outputs : 输出

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

Note that this will only work for plain text environment (such as <pre></pre> , like in the demo). 请注意,这仅适用于纯文本环境(如演示中的<pre></pre> )。 Otherwise, you'll need to use <br /> instead of \\n for line breaks, or use an ordered or unordered list. 否则,您需要使用<br />而不是\\n来换行,或者使用有序列表或无序列表。

For HTML output, use this, whose output can be seen here 对于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>';

Generates: 产生:

  • dir0 DIR0
    • file0.txt file0.txt
    • file1.txt FILE1.TXT
  • dir1 DIR1
    • file2.txt FILE2.TXT
    • filea.txt filea.txt
  • dir2 DIR2
    • fileb.txt fileb.txt

For your updated array, here is the solution: 对于更新的阵列,以下是解决方案:

$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";
}

This outputs : 输出

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

I'll leave it up to you to translate that into HTML if necessary. 如有必要,我将由您自己将其转换为HTML。

You want to use a loop and do this. 您要使用循环并执行此操作。

 <?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);

That will reorganize your array and then print_r it, showing you the new structure. 这将重新组织您的数组,然后将其print_r,显示给您新的结构。 Then you can do this: 然后,您可以执行以下操作:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM