2

私は配列を持っています:

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)

値を追加してルートに表示する必要があります。

4

2 に答える 2

5

最良の方法は、キーがディレクトリであり、配列値が次のようにファイル名を含む配列になるように配列を再フォーマットすることです。

$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に変換するのはあなたに任せます。

于 2012-06-26T18:48:59.460 に答える
1

ループを使用してこれを実行します。

 <?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され、新しい構造が表示されます。次に、これを行うことができます:

    <?php
    foreach($directories as $directory => $files)
    {
      echo "$directory<br><ul>";
      foreach($files as $file)
      {
          echo "<li>$file</li>";
      }
      echo "</ul>";
  }
于 2012-06-26T18:50:18.943 に答える