2

ExtJSツリーパネル内のフォルダー構造を一覧表示するJson出力を作成したいと思います。構造は、Jsonのこの配列と同等である必要があります。

Array
(
    [text] => .
    [children] => Array
        (
            [0] => Array
                (
                    [text] => files
                    [children] => 
                )

            [1] => Array
                (
                    [text] => folder 1
                    [children] => 
                )

            [2] => Array
                (
                    [text] => New directory
                    [children] => array(
                        [0] => Array
                            (
                                [text] => sub_1
                                [children] => array(
                                    [0] => Array
                                        (
                                            [text] => sub_1_1
                                            [children] => 
                                        )
                                    [1] => Array
                                        (
                                            [text] => sub_1_2
                                            [children] => 
                                        )                                    
                                )
                            )
                        [1] => Array
                            (
                                [text] => sub_2
                                [children] => 
                            )                             
                    )
                )    
        )    
)

PHPのマニュアルと例を使って構造を示すこの関数を作成しました

listFolders('../file_uploads/');
function listFolders($dir){
    $dh = scandir($dir);
    echo '<ul>';
    foreach($dh as $folder){
        if($folder != '.' && $folder != '..')
        {
            if(is_dir($dir.'/'.$folder)){
                echo '<li>'.$folder.'</li>';
                listFolders($dir.'/'.$folder);
            }
        }
    }
    echo '</ul>';
}

これは構造を出力します

  • 新しいディレクトリ
    • sub_1
      • sub_1_1
        • sub_1_1_1
        • sub_1_2
        • sub_2
        • ファイル
          • フォルダー1

            この出力を上記のような配列(またはJson)に変換する方法を知りたいですか?

            解決

            print "<pre>";
            print_r(listFolders('../file_uploads/'));
            
            function listFolders($dir)
            {
                $dh = scandir($dir);
                $return = array();
            
                foreach ($dh as $folder) {
                    if ($folder != '.' && $folder != '..') {
                        if (is_dir($dir . '/' . $folder)) {
                            $return[] = array(
                                'text' => $folder,
                                'children' => listFolders($dir . '/' . $folder)
                            );
                        }
                    }
                }
                return $return;
            }
            

            ここに画像の説明を入力してください

            4

            5 に答える 5

            6

            次のコードを試してください。

            function listFolders($dir)
            {
                $dh = scandir($dir);
                $return = array();
            
                foreach ($dh as $folder) {
                    if ($folder != '.' && $folder != '..') {
                        if (is_dir($dir . '/' . $folder)) {
                            $return[] = array($folder => listFolders($dir . '/' . $folder));
                        } else {
                            $return[] = $folder;
                        }
                    }
                }
                return $return;
            }
            

            適切にテストされていませんが、私にとってはうまくいくようです。

            于 2013-01-16T12:29:55.487 に答える
            1

            まず、アレイを作成します。設立されたディレクトリごとに、array_pushを配列に使用しますか?

            http://php.net/manual/en/function.scandir.phpのコメントもご覧ください。

            于 2013-01-16T12:22:42.897 に答える
            1
            <?php
            error_reporting(0);
            
            $array_folders  = listFolders('../file_uploads/');
            echo "<pre>";
            print_r($array_folders);
            
            function listFolders($dir){
                global $ret_array;
                $dh = scandir($dir);
                foreach($dh as $folder){
                    if($folder != '.' && $folder != '..')
                    {
                        if(is_dir($dir.'/'.$folder)){
                            $ret_array[$dir][]  = $folder;
                            listFolders($dir.'/'.$folder);
                        }
                    }
                }
                return $ret_array;
            }
            ?>
            
            于 2013-01-16T12:32:31.333 に答える
            0

            まったく同じ結果を得るには、次のコードに従ってください

            function listFolderFiles($dir){
                $ffs = scandir($dir);
            
                unset($ffs[array_search('.', $ffs, true)]);
                unset($ffs[array_search('..', $ffs, true)]);
            
                // prevent empty ordered elements
                //if (count($ffs) < 1)
                //    return;
            
            
                $dirStrArr = array();
                foreach($ffs as $ff){
                    if(is_dir($dir.'/'.$ff)) {
                        $dirStrArr[]=array('parent' => $ff, 'children' => listFolderFiles($dir . '/' . $ff));
                    }else{
                        $dirStrArr[]=$ff;
                    }
                }
                return $dirStrArr;
            }
            

            または、フォルダー名をインデックスとして取得し、子の詳細をインデックスの配列に取得するには、次のコードに従います。

            function listFolderFiles($dir){
                $ffs = scandir($dir);
            
                unset($ffs[array_search('.', $ffs, true)]);
                unset($ffs[array_search('..', $ffs, true)]);
            
                // prevent empty ordered elements
                //if (count($ffs) < 1)
                //    return;
            
            
                $dirStrArr = array();
                foreach($ffs as $ff){
                    if(is_dir($dir.'/'.$ff)) {
                        $dirStrArr[$ff]=listFolderFiles($dir . '/' . $ff);
                    }else{
                        $dirStrArr[]=$ff;
                    }
                }
                return $dirStrArr;
            }
            
            于 2017-05-27T14:53:37.017 に答える