Php 将数组转换为ul-li列表

Php 将数组转换为ul-li列表,php,html,arrays,multidimensional-array,html-lists,Php,Html,Arrays,Multidimensional Array,Html Lists,因此,我有一个文件,其中包含如下所示的文件路径字符串。。 /CatDV/S1/SFX/steam/6004_90_04大前灯SM.wav /CatDV/S1/SFX/steam/AIRHISSPRESSURE HIT032001.wav /CatDV/S1/SFX/steam/Impact_金属_子弹_命中(1).wav ./CatDV/S1/SFX/steam/Impact\u Metal\u Bullet\u Hit.wav /CatDV/S1/SFX/steam/6004_94_02大型

因此,我有一个文件,其中包含如下所示的文件路径字符串。。

/CatDV/S1/SFX/steam/6004_90_04大前灯SM.wav
/CatDV/S1/SFX/steam/AIRHISSPRESSURE HIT032001.wav
/CatDV/S1/SFX/steam/Impact_金属_子弹_命中(1).wav
./CatDV/S1/SFX/steam/Impact\u Metal\u Bullet\u Hit.wav
/CatDV/S1/SFX/steam/6004_94_02大型重型玻璃钢
/CatDV/S1/SFX/蒸汽/冲击玻璃
/CatDV/S1/SFX/蒸汽/空气释放重型HIT03701.wav
./CatDV/S1/SFX/steam/SDR02_15SCIF hyrthicrever.wav
./CatDV/S1/SFX/steam/VAL02_08CRSH GlassBreaking.wav
/CatDV/S1/SFX/蒸汽/空气释放器LARGEI HIT00601.wav
/CatDV/S1/SFX/steam/SDR02_14SCIF节奏3beat.wav
/CatDV/S1/SFX/steam/6004_94_01 LargeGlassSmash.wav

我想把所有这些都分成ul li列表

> CatDV
    > S1
        > SFX
            > steam
                > filename.extension
等等

这就是我正在使用的阵列。我用下面的函数将其输出

array(1) {
  [""]=>
  array(1) {
    ["CatDV"]=>
    array(1) {
      ["S1"]=>
      array(1) {
        ["SFX"]=>
        array(1) {
          ["steam"]=>
          array(12) {
            ["6004_90_04 LargeHeadlightSm.wav"]=>
                string(52) "./CatDV/S1/SFX/steam/6004_90_04 LargeHeadlightSm.wav"
            ["AirHissPressureRe HIT032001.wav"]=>
                string(52) "./CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav"
            ["Impact_Metal_Bullet_Hit(1).wav"]=>
                string(51) "./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit(1).wav"
            ["Impact_Metal_Bullet_Hit.wav"]=>
                string(48) "./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit.wav"
            ["6004_94_02 LargeHeavyGlassS.wav"]=>
               string(52) "./CatDV/S1/SFX/steam/6004_94_02 LargeHeavyGlassS.wav"
            ["Impact_Glass_Smash.wav"]=>
               string(43) "./CatDV/S1/SFX/steam/Impact_Glass_Smash.wav"
            ["AirReleaseHeavyAi HIT030701.wav"]=>
               string(52) "./CatDV/S1/SFX/steam/AirReleaseHeavyAi HIT030701.wav"
            ["SDR02_15SCIF RhythmicRever.wav"]=>
               string(51) "./CatDV/S1/SFX/steam/SDR02_15SCIF RhythmicRever.wav"
            ["VAL02_08CRSH GlassBreaking.wav"]=>
               string(51) "./CatDV/S1/SFX/steam/VAL02_08CRSH GlassBreaking.wav"
            ["AirReleaseLargeAi HIT030601.wav"]=>
              string(52) "./CatDV/S1/SFX/steam/AirReleaseLargeAi HIT030601.wav"
            ["SDR02_14SCIF Rhythmic3Beat.wav"]=>
              string(51) "./CatDV/S1/SFX/steam/SDR02_14SCIF Rhythmic3Beat.wav"
            ["6004_94_01 LargeGlassSmash.wav"]=>
              string(51) "./CatDV/S1/SFX/steam/6004_94_01 LargeGlassSmash.wav"
          }
        }
      }
    }
  }
}
现在,我在将其转换为ul li列表时遇到了困难,我可以将其输出到html中并对其进行样式化

function arch_list($output) {
// //Conditional for Archives Page
    $data = file(get_template_directory_uri() . '/js/angular/data/list_test.txt', FILE_IGNORE_NEW_LINES);

    $path = array('data' => $data);
    $output = array();
    foreach ($path['data'] as $d) {
        $out = preg_split('/(\.)*\//', $d);
        $outArr = $d;
        for ($i = count($out) - 1; $i >= 0; $i--) {             
            $outArr = array($out[$i] => $outArr);               
        }
        // return $outArr;
        $output = array_merge_recursive($output, $outArr);

    }
    return $output;
}   
感谢您的帮助!
谢谢。

由于您不知道树的深度,您可以使用递归函数调用来显示ul/li树。这实际上就像在中一样,但是,您在这里有不同的决策点:

$file = './CatDV/S1/SFX/steam/6004_90_04 LargeHeadlightSm.wav
./CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav
./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit(1).wav
./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit.wav
./CatDV/S1/SFX/steam/6004_94_02 LargeHeavyGlassS.wav
./CatDV/S1/SFX/steam/Impact_Glass_Smash.wav
./CatDV/S1/SFX/steam/AirReleaseHeavyAi HIT030701.wav
./CatDV/S1/SFX/steam/SDR02_15SCIF RhythmicRever.wav
./CatDV/S1/SFX/steam/VAL02_08CRSH GlassBreaking.wav
./CatDV/S1/SFX/steam/AirReleaseLargeAi HIT030601.wav
./CatDV/S1/SFX/steam/SDR02_14SCIF Rhythmic3Beat.wav
./CatDV/S1/SFX/steam/6004_94_01 LargeGlassSmash.wav';

$tree = [];
foreach (explode("\n", $file) as $line) {
    $node = &$tree;
    foreach (explode('/', $line) as $segment) {
        $node = &$node[$segment];
    }
    $node = $line;
    unset($node);
}

call_user_func(function ($array) {
    $ul = function ($array) use (&$ul) {
        echo '<ul>', !array_walk($array, function ($child, $key) use ($ul) {
            echo '<li>', $key, is_array($child) ? $ul($child) : ''
            , '</li>';
        }, $array), '</ul>';
    };
    $ul($array);
}, $tree);

由于您不知道树的深度,因此可以使用递归函数调用来显示ul/li树。这实际上就像在中一样,但是,您在这里有不同的决策点:

$file = './CatDV/S1/SFX/steam/6004_90_04 LargeHeadlightSm.wav
./CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav
./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit(1).wav
./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit.wav
./CatDV/S1/SFX/steam/6004_94_02 LargeHeavyGlassS.wav
./CatDV/S1/SFX/steam/Impact_Glass_Smash.wav
./CatDV/S1/SFX/steam/AirReleaseHeavyAi HIT030701.wav
./CatDV/S1/SFX/steam/SDR02_15SCIF RhythmicRever.wav
./CatDV/S1/SFX/steam/VAL02_08CRSH GlassBreaking.wav
./CatDV/S1/SFX/steam/AirReleaseLargeAi HIT030601.wav
./CatDV/S1/SFX/steam/SDR02_14SCIF Rhythmic3Beat.wav
./CatDV/S1/SFX/steam/6004_94_01 LargeGlassSmash.wav';

$tree = [];
foreach (explode("\n", $file) as $line) {
    $node = &$tree;
    foreach (explode('/', $line) as $segment) {
        $node = &$node[$segment];
    }
    $node = $line;
    unset($node);
}

call_user_func(function ($array) {
    $ul = function ($array) use (&$ul) {
        echo '<ul>', !array_walk($array, function ($child, $key) use ($ul) {
            echo '<li>', $key, is_array($child) ? $ul($child) : ''
            , '</li>';
        }, $array), '</ul>';
    };
    $ul($array);
}, $tree);
试试这个

<?php
    $fileToOpen="/js/angular/data/list_test.txt";

    function arch_list($fileToOpen) {
        if(file_exists($fileToOpen)){
            $file=fopen($fileToOpen,"r");
            while($line = fgets($file)){
               //We have a line of the file,split it up
               $directories=explode("/",$line);
                //Remove the period, it will be the first element in the array
               $directories=array_shift($directories);
               //Add this set of directories to a parent array
               $allDirectories[]=$directories;
            }
            fclose($fileToOpen);

        }//End of opening file

        //We now have a multidimensional array, 
        //An array holding arrays with each set of directories.
        if(!empty($allDirectories)){
           foreach($allDirectories as $directory){
               $fullString.="<ul class='your-class'>";
               foreach($directory as $pathway){
                   //We have each single item in a directory path
                     $fullString.="<li>".$pathway."</li>";
               }
               $fullString.="</ul>";
           }
        }
        return $fullString;
    }

    echo arch_list($fileToOpen);


?>
试试这个

<?php
    $fileToOpen="/js/angular/data/list_test.txt";

    function arch_list($fileToOpen) {
        if(file_exists($fileToOpen)){
            $file=fopen($fileToOpen,"r");
            while($line = fgets($file)){
               //We have a line of the file,split it up
               $directories=explode("/",$line);
                //Remove the period, it will be the first element in the array
               $directories=array_shift($directories);
               //Add this set of directories to a parent array
               $allDirectories[]=$directories;
            }
            fclose($fileToOpen);

        }//End of opening file

        //We now have a multidimensional array, 
        //An array holding arrays with each set of directories.
        if(!empty($allDirectories)){
           foreach($allDirectories as $directory){
               $fullString.="<ul class='your-class'>";
               foreach($directory as $pathway){
                   //We have each single item in a directory path
                     $fullString.="<li>".$pathway."</li>";
               }
               $fullString.="</ul>";
           }
        }
        return $fullString;
    }

    echo arch_list($fileToOpen);


?>

我在看@hakre的。它将最低级别的key=>值设置为2
  • ,我认为这不是所需要的。我的解决方案(假设有多维数组):

    $arrayvar=array(“空白?”=>
    阵列(“CatDV”=>
    数组(“S1”=>
    数组(“SFX”=>
    数组(“蒸汽”=>
    阵列(“6004_90_04 LargeHeadlightSm.wav”=>
    “/CatDV/S1/SFX/steam/6004_90_04大前灯SM.wav”,
    “AirHissPressureRe HIT032001.wav”=>
    “/CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav”()()()()));
    makeul($arrayvar);
    函数makeul($avar){//makeul
    如果(!is_数组($avar))退出(“错误:不是数组”);
    回声(
      ); 重置($avar);while(true){//循环遍历数组 $key=key($avar); if(is_null($key))break;//如果为null,则循环结束 $val=$avar[$key]; if(is_scalar($val))zecho(“
    • $key=>$val
    • ”); else{zecho(
    • $key”);makeul($val);zecho(
    • );}//递归 下一个($avar);} zecho(“
    ”); } 函数zecho($param){//echo与br&\n echo$param,“
    \n”; }
    编辑(为hakre):谢谢你,我从你的代码中学到了很多,但它不是不必要的晦涩吗?
    下面的内容不是同样好而且更清楚吗

    $tree = ..
    makeul($tree, '');
    
    function makeul($val, $key) { 
      if ($key <> "") echo "<li>$key\n";
      if (is_array($val)) { 
        echo("<ul>"); array_walk($val, 'makeul'); echo("</ul>\n"); }
      else {
        echo("=>$val<br />\n"); }
      if ($key <> "") echo "</li>";
      }
    
    $tree=。。
    makeul($tree,”);
    函数makeul($val,$key){
    如果($key“”)回显“
  • $key\n”; 如果(是_数组($val)){ echo(
      );数组(walk($val,'makeul');echo(
    \n”)} 否则{ 回音(“=>$val
    \n”);} 如果($key“”)回显“
  • ”; }
    我正在看@hakre's。它将最低级别的key=>值设置为2
  • ,我认为这不是所需要的。我的解决方案(假设有多维数组):

    $arrayvar=array(“空白?”=>
    阵列(“CatDV”=>
    数组(“S1”=>
    数组(“SFX”=>
    数组(“蒸汽”=>
    阵列(“6004_90_04 LargeHeadlightSm.wav”=>
    “/CatDV/S1/SFX/steam/6004_90_04大前灯SM.wav”,
    “AirHissPressureRe HIT032001.wav”=>
    “/CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav”()()()()));
    makeul($arrayvar);
    函数makeul($avar){//makeul
    如果(!is_数组($avar))退出(“错误:不是数组”);
    回声(
      ); 重置($avar);while(true){//循环遍历数组 $key=key($avar); if(is_null($key))break;//如果为null,则循环结束 $val=$avar[$key]; if(is_scalar($val))zecho(“
    • $key=>$val
    • ”); else{zecho(
    • $key”);makeul($val);zecho(
    • );}//递归 下一个($avar);} zecho(“
    ”); } 函数zecho($param){//echo与br&\n echo$param,“
    \n”; }
    编辑(为hakre):谢谢你,我从你的代码中学到了很多,但它不是不必要的晦涩吗?
    下面的内容不是同样好而且更清楚吗

    $tree = ..
    makeul($tree, '');
    
    function makeul($val, $key) { 
      if ($key <> "") echo "<li>$key\n";
      if (is_array($val)) { 
        echo("<ul>"); array_walk($val, 'makeul'); echo("</ul>\n"); }
      else {
        echo("=>$val<br />\n"); }
      if ($key <> "") echo "</li>";
      }
    
    $tree=。。
    makeul($tree,”);
    函数makeul($val,$key){
    如果($key“”)回显“
  • $key\n”; 如果(是_数组($val)){ echo(
      );数组(walk($val,'makeul');echo(
    \n”)} 否则{ 回音(“=>$val
    \n”);} 如果($key“”)回显“
  • ”; }
    我已经将@hakre的答案中糟糕透顶的代码重构为稍微不那么敬畏上帝。它使用相同的算法:

    $file = './CatDV/S1/SFX/steam/6004_90_04 LargeHeadlightSm.wav
    ./CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav
    ./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit(1).wav
    ./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit.wav
    ./CatDV/S1/SFX/steam/6004_94_02 LargeHeavyGlassS.wav
    ./CatDV/S1/SFX/steam/Impact_Glass_Smash.wav
    ./CatDV/S1/SFX/steam/AirReleaseHeavyAi HIT030701.wav
    ./CatDV/S1/SFX/steam/SDR02_15SCIF RhythmicRever.wav
    ./CatDV/S1/SFX/steam/VAL02_08CRSH GlassBreaking.wav
    ./CatDV/S1/SFX/steam/AirReleaseLargeAi HIT030601.wav
    ./CatDV/S1/SFX/steam/SDR02_14SCIF Rhythmic3Beat.wav
    ./CatDV/S1/SFX/steam/6004_94_01 LargeGlassSmash.wav';
    
    这些是内部函数,您不需要直接调用它们

    function splitIntoPaths($string) {
        $paths = array();
        foreach (explode("\n", $string) as $line) {
            $node = &$paths;
            foreach (explode("/", $line) as $segment) {
                if (!isset($node[$segment])) {
                    $node[$segment] = array();
                }
                $node = &$node[$segment];
            }
            $node = $line;
        }
        return $paths;
    }
    
    function createListFromArray(array $array) {
        $return = "<ul>";
        foreach ($array as $key => $value) {
            $return .= "<li>" . $key;
            if (is_array($value)) {
                $return .= createListFromArray($value);
            }
            $return .= "</li>";
        }
        return $return . "</ul>";
    }
    
    用法:

    $tree = createTree($file);
    

    我已经将@hakre的答案中可怕的代码重构为稍微不那么敬畏上帝。它使用相同的算法:

    $file = './CatDV/S1/SFX/steam/6004_90_04 LargeHeadlightSm.wav
    ./CatDV/S1/SFX/steam/AirHissPressureRe HIT032001.wav
    ./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit(1).wav
    ./CatDV/S1/SFX/steam/Impact_Metal_Bullet_Hit.wav
    ./CatDV/S1/SFX/steam/6004_94_02 LargeHeavyGlassS.wav
    ./CatDV/S1/SFX/steam/Impact_Glass_Smash.wav
    ./CatDV/S1/SFX/steam/AirReleaseHeavyAi HIT030701.wav
    ./CatDV/S1/SFX/steam/SDR02_15SCIF RhythmicRever.wav
    ./CatDV/S1/SFX/steam/VAL02_08CRSH GlassBreaking.wav
    ./CatDV/S1/SFX/steam/AirReleaseLargeAi HIT030601.wav
    ./CatDV/S1/SFX/steam/SDR02_14SCIF Rhythmic3Beat.wav
    ./CatDV/S1/SFX/steam/6004_94_01 LargeGlassSmash.wav';
    
    这些是内部函数,您不需要直接调用它们

    function splitIntoPaths($string) {
        $paths = array();
        foreach (explode("\n", $string) as $line) {
            $node = &$paths;
            foreach (explode("/", $line) as $segment) {
                if (!isset($node[$segment])) {
                    $node[$segment] = array();
                }
                $node = &$node[$segment];
            }
            $node = $line;
        }
        return $paths;
    }
    
    function createListFromArray(array $array) {
        $return = "<ul>";
        foreach ($array as $key => $value) {
            $return .= "<li>" . $key;
            if (is_array($value)) {
                $return .= createListFromArray($value);
            }
            $return .= "</li>";
        }
        return $return . "</ul>";
    }
    
    用法:

    $tree = createTree($file);
    

    您可以使用嵌套的
    foreach()
    s遍历数组,其中使用
      包装每个
      foreach()
      ,并在
      foreach()
      内部使用
    • 包装每个值。您还可以将其编写为递归函数,以便在结构发生变化/是动态的情况下进行n级深入。因此,您希望作为子目录的每个项都成为前一项列表中的子项吗?您可以使用嵌套的
      foreach()
      s遍历数组,将每个
      foreach()进行包装
      一起,在
      foreach()内部
    • 将每个值包装起来。您还可以将其编写为递归函数,在结构发生变化/是动态的情况下,它将执行n级深入操作。因此,您希望作为子目录的每个项都成为前一项列表中的子项?而不是退出,只需在参数前面加上
      数组
      ,使类型为h即可