显示阵列树形结构在PHP [英] Displaying array as tree structure in php

查看:208
本文介绍了显示阵列树形结构在PHP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数组:

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?

编辑:更新了多维数组:

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

的值需要被添加,并在根中显示

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

输出的:

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

请注意,这将只对纯文本的环境中工作(如< pre>< / pre> ,就像在演示) 。否则,你需要使用< BR /> 而不是 \\ n 换行,或使用有序或无序列表。

Note that this will only work for plain text environment (such as <pre></pre>, like in the demo). Otherwise, you'll need to use <br /> instead of \n for line breaks, or use an ordered or unordered list.

对于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
    • file2.txt
    • filea.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";
    }
    

    输出的:

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

    我会离开它,你如果需要翻译成HTML。

    I'll leave it up to you to translate that into HTML if necessary.

    这篇关于显示阵列树形结构在PHP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆