7

これが私のphpスクリプトです:

<?php

$path = $_SERVER['DOCUMENT_ROOT'].'/test';

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);

foreach($objects as $name => $object){  
    echo  $objects->getDepth() . " " . $object->getFilename() . "<br/>";
    }

?>

これは、スクリプトが繰り返し処理しているディレクトリ/ファイル ツリーです。(これは $_SERVER['DOCUMENT_ROOT'].'/test' という単純なルート ディレクトリにあります):

/food
/food/drinks
/food/drinks/water.html
/food/drinks/milk.html
/food/drinks/soda.html
/food/entrees
/food/entrees/hot
/food/entrees/hot/hamburger.html
/food/entrees/hot/pizza.html
/food/entrees/cold
/food/entrees/cold/icecream.html
/food/entrees/cold/salad.html
/cosmetics
/cosmetics/perfume
/cosmetics/perfume/chic.html
/cosmetics/perfume/polo.html
/cosmetics/perfume/lust.html
/cosmetics/lipstick
/cosmetics/lipstick/colors
/cosmetics/lipstick/colors/red.html
/cosmetics/lipstick/colors/pink.html
/cosmetics/lipstick/colors/purple.html

スクリプトの出力は次のとおりです。

0 food
1 drinks
2 milk.html
2 water.html
2 soda.html
1 info.php
1 entrees
2 hot
3 pizza.html
3 hamburger.html
2 cold
3 ice_cream.html
3 salad.html
0 cosmetics
1 lipstick
2 colors
3 pink.html
3 red.html
3 purple.html
1 perfume
2 polo.html
2 lust.html
2 chic.html
0 error_log
0 test.php

$objects->getDepth() 整数を無視します。参考までに

質問: 次のように、代わりにネストされた順序なしリストを出力するようにスクリプトを変更するにはどうすればよいですか:

<ul>
  <li>food</li>
    <ul>
      <li>drinks</li>
        <ul>
          <li>water.html</li>
          <li>milk.html</li>
          <li>soda.html</li>
        </ul>
      <li>entrees</li>
        <ul>
          <li>hot</li>
            <ul>
              <li>hamburger.html</li>
              <li>pizza.html</li>
            </ul>
          <li>cold</li>
            <ul>
              <li>icecream.html</li>
              <li>salad.html</li>
            </ul>      
        </ul>
    </ul>
  <li>cosmetics</li>
    <ul>
      <li>perfume</li>
        <ul>
          <li>chic.html</li>
          <li>polo.html</li>
          <li>lust.html</li>
        </ul>
      <li>lipstick</li>
        <ul>
          <li>colors</li>
            <ul>

ありがとう!

4

2 に答える 2

16

これはDomDocumentを使用したものです

基本的な考え方は、各ディレクトリの内容は で表され、<ul>ディレクトリ内の各要素は で表され、<li>
要素が空でないディレクトリである場合、内容<ul>を表す が含まれます。

$path = $_SERVER['DOCUMENT_ROOT'].'/test';
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
$dom = new DomDocument("1.0");
$list = $dom->createElement("ul");
$dom->appendChild($list);
$node = $list;
$depth = 0;
foreach($objects as $name => $object){  
    if ($objects->getDepth() == $depth){
//the depth hasnt changed so just add another li
        $li = $dom->createElement('li', $object->getFilename());
        $node->appendChild($li);
    }
    elseif ($objects->getDepth() > $depth){
//the depth increased, the last li is a non-empty folder 
        $li = $node->lastChild;
        $ul = $dom->createElement('ul');
        $li->appendChild($ul);
        $ul->appendChild($dom->createElement('li', $object->getFilename()));
        $node = $ul;
    }
    else{
//the depth decreased, going up $difference directories
        $difference = $depth - $objects->getDepth();
        for ($i = 0; $i < $difference; $difference--){
            $node = $node->parentNode->parentNode;
        }
        $li = $dom->createElement('li', $object->getFilename());
        $node->appendChild($li);
    }
    $depth = $objects->getDepth();
}
echo $dom->saveHtml();

出力は次のようになります

<ul>
    <li>dir1</li>
    <li>dir2
        <ul>
            <li>in dir2</li>
        <ul>
    <li>file in root</li>
<ul> 
于 2012-05-28T06:07:21.900 に答える
1

深さを変数に格納し、ループごとに変数が増加または減少したかどうかを確認しますか?

深さが増した場合は別の<ul>タグを追加し、減った場合は終了</ul>タグを追加します。

各ループは常に<li>タグを出力してファイル名をラップします。

例えば

$depth = 0;
foreach ($objects as $name => $object) {
    $depth2 = $objects->getDepth();
    if($depth2 > $depth) { echo '<ul>'; }
    echo "<li>" . $object->getFilename() . "</li>";
    if($depth2 < $depth) { echo '</ul>'; }
    $depth = $depth2;
}

既存のコードに合わせて追加のテストと変更が必要になりますが、いくつかのアイデアが得られることを願っています.

于 2012-05-28T05:14:18.157 に答える