2013-01-16 5 views
2

Je souhaite créer une sortie JSON pour répertorier la structure de dossiers dans le panneau de l'arborescence ExtJS. La structure devrait être l'équivalent de ce tableau en JSON:Comment construire un tableau qui contient une structure de dossiers?

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] => 
          )        
        ) 
       )  
     )  
) 

i fait cette fonction qui montre la structure en passant par Manuel PHP et des exemples

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

cette commande affiche la structure

  • Nouveau répertoire
    • sub_1
      • sub_1_1
        • sub_1_1_1
        • sub_1_2
        • sub_2
        • fichiers
          • dossier 1

            Je veux savoir comment convertir cette sortie à un tableau (ou JSON) comme ci-dessus?

            solution

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

            enter image description here

            +0

            Pourquoi en avez-vous besoin dans un tableau? – Gordon

            +0

            Je veux construire une sortie json pour lister la structure du dossier dans un panneau d'arborescence extjs –

            Répondre

            6

            Essayez le code suivant:

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

            semble fonctionner pour moi, n'a pas été testé correctement si.

            +0

            Merci, cela crée le tableau imbriqué, mais aucune idée comment obtenir la paire de valeur de clé avec cette fonction comme le tableau que j'ai posté? –

            +0

            joué avec cette fonction pendant un certain temps et j'ai compris comment obtenir exactement ce dont j'avais besoin. merci –

            +0

            Heureux que cela a aidé. –

            1

            d'abord créer un tableau. Pour chaque répertoire found, utilisez array_push pour le tableau?

            Regardez également les commentaires sur http://php.net/manual/en/function.scandir.php.

            +1

            à peine une réponse. pouvez-vous améliorer en montrant l'OP quelques échantillons de code? Comment cela va-t-il créer un tableau imbriqué? – Gordon

            +0

            essayé mais aucune idée comment pousser les sous-répertoires dans les répertoires principaux pertinents –

            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; 
            } 
            ?> 
            
            0

            Je pense que vous recherchez une liste de répertoires récursive. Utilisez ci-dessous le code J'espère que cela devrait vous aider. Ça marche pour moi.

            <?php 
            /** 
            * Function for recursive directory file list search as an array. 
            * 
            * @param mixed $dir Main Directory Path. 
            * 
            * @return array 
            */ 
            function listFolderFiles($dir) 
            { 
                $fileInfo  = scandir($dir); 
                $allFileLists = []; 
            
                foreach ($fileInfo as $folder) { 
                 if ($folder !== '.' && $folder !== '..') { 
                  if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) { 
                   $allFileLists[$folder . '/'] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder); 
                  } else { 
                   $allFileLists[$folder] = $folder; 
                  } 
                 } 
                } 
            
                return $allFileLists; 
            }//end listFolderFiles() 
            
            
            $dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc'); 
            echo '<pre>'; 
            print_r($dir); 
            echo '</pre>' 
            
            ?> 
            
            0

            Pour obtenir le même résultat exact que vous pouvez, suivre le code ci-dessous

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

            Ou pour obtenir le nom du dossier que l'index et les détails de l'enfant dans le tableau de l'index, vous pouvez suivre le soufflet code

            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; 
            } 
            
            Questions connexes