9
votes

Parse Directory Structure (chaînes) à JSON en utilisant php

J'ai une gamme de cordes de chemin de fichier comme celle-ci

  • vidéos / drôles / jelloman.wmv
  • Vidéos / drôles / BOBLYDANCE.FLV
  • Vidéos / ABC.MP4
  • Vidéos / juin.mp4
  • Vidéos / CLEAVER.MP4
  • Audio / Uptown.mp3
  • Audio / Juicy.mp3
  • fun.wmv
  • jimmy.wmv
  • herman.wmv

    L'objectif final est de les amener à Jstere. J'ai construit un prototype d'arbre des chaînes d'échantillonnage ci-dessus. Vérifiez-le: http://jsfiddle.net/ecropolis/paqas/


3 commentaires

Vous devriez réparer le formatage ... Coller tout le code puis utilisez le bouton {} pour obtenir les indentations. (Ou indentez tout 4 espaces).


Je ne vois pas la récursivité dans votre structure ...


Le dossier 'drôle' est imbriqué à l'intérieur du dossier 'Videos' Je viens de nier un niveau mais pourrait continuer à aller. Je ne peux jamais sembler comprendre le fomatting! Pardon.


3 Réponses :


16
votes

Tout d'abord, je créerais une fonction récursive pour itérer votre répertoire dans un tableau xxx

, puis émettez la matrice avec json_encode > Source utilisée à partir de: http://www.php.net/manual/ fr / fonction.readdir.php # 87733


3 commentaires

J'ai les noms de fichiers ci-dessus comme chaînes dans un tableau. Puisque je ne lis pas un répertoire réel avec PHP, je n'ai pas accès à des fonctions telles que is_file peut-être que tout ce que j'ai vraiment besoin de me déplacer. Dans mon cas si je suis divisé sur '/', le fichier est le dernier élément de la chaîne explosée au tableau. (Les chaînes de fichiers provenaient d'une requête à Amazon S3)


@RobertPitt essayant d'obtenir un résultat similaire avec le récursivérateur. Merci pour toute aide dans Stackoverflow.com/questions / 24121723 / ...


Cela jette une erreur PHP Erreur fatale: Erreur non capturée: en utilisant $ ceci quand pas dans le contexte de l'objet



2
votes

J'ai pu utiliser cette excellente solution (le bas posté par @casablanca) pour traiter les chaînes ci-dessus dans une structure de matrice récursive. convertir une gamme de chemins dans la liste UL

<?php
    $paths = array('videos/funny/jelloman.wmv','videos/funny/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv', 'jimmy.wmv','herman.wmv');
    sort($paths); 
    $array = array();
    foreach ($paths as $path) {
      $path = trim($path, '/');
      $list = explode('/', $path);
      $n = count($list);

      $arrayRef = &$array; // start from the root
      for ($i = 0; $i < $n; $i++) {
        $key = $list[$i];
        $arrayRef = &$arrayRef[$key]; // index into the next level
      }
    }

    function buildUL($array, $prefix,$firstrun) {     
        $c = count($array);
      foreach ($array as $key => $value) {
            $path_parts = pathinfo($key);
            if($path_parts['extension'] != '') {
                $extension = $path_parts['extension'];
            } else {
                $extension = 'folder';
            }
            if ($prefix == '') { //its a folder
                echo ' { "data":"'.$key.'"';
            } else { //its a file
                echo '{"data" : {"title":"'.$key.'"},"attr":{"href": "'.$prefix.$key.'","id": "1239"},
                "icon": "images\/'.$extension.'-icon.gif"';
            }
            // if the value is another array, recursively build the list$key
            if (is_array($value)) {
                echo ',"children" : [ ';
                buildUL($value, "$prefix$key/",false);
            }
            echo "}";
            $c = $c-1;
            if($c != 0) {
                echo ",";
            }
      } //end foreach
     if($firstrun != true) 
      echo "]";
    }

    echo '{ "data" : [';
    buildUL($array, '',true);
    echo '] }';
?> 


1 commentaires

Je vous ai voté pour essayer de créer manuellement un objet JSON en utilisant rien que de la concaténation, veuillez vous reporter à la complexité JSON_ENCODE



1
votes

J'ai corrigé la réponse de la concaténation choisie par @ecropolis à utiliser des tableaux. Son exemple initial m'a aidé, mais je suis d'accord avec @RobertPitt que j'ai besoin d'un json_encode pour vraiment être correctement une bonne solution.

  $filesArray = array('videos/funny/jelloman.wmv','videos/funny/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv', 'jimmy.wmv','herman.wmv');
  $finalTree = $this->parseArrayToTree($filesArray);

  $finalJsonTree = json_encode($finalTree);

  function parseArrayToTree($paths) {
    sort($paths);
    $array = array();
    foreach ($paths as $path)
    {
      $path = trim($path, '/');
      $list = explode('/', $path);
      $n = count($list);

      $arrayRef = &$array; // start from the root
      for ($i = 0; $i < $n; $i++)
      {
        $key = $list[$i];
        $arrayRef = &$arrayRef[$key]; // index into the next level
      }
    }

    $dataArray = array();
    $dataArray['data'] = array();
    $dataArray['data'] = $this->buildUL($array, '');
    return $dataArray;
  }

  function buildUL($array, $prefix) {
    $finalArray = array();

    foreach ($array as $key => $value)
    {
      $levelArray = array();
      $path_parts = pathinfo($key);
      if (!empty($path_parts['extension']) && $path_parts['extension'] != '')
      {
        $extension = $path_parts['extension'];
      }
      else
      {
        if (empty($value))
        {
          $extension = "";
        }
        else if (is_array($value))
        {
          $extension = 'folder';
        }
      }

      if (is_array($value))
      { //its a folder
        $levelArray['data'] = $key;
      }
      else
      { //its a file
        $levelArray['data']['title'] = $key;
        $levelArray['attr']['href'] = $prefix . $key;
        $levelArray['attr']['id'] = $prefix . $key;
        $levelArray['icon'] = "images/" . $extension . "-icon.gif";
      }

      // if the value is another array, recursively build the list$key
      if (is_array($value))
      {
        $levelArray['children'] = $this->buildUL($value, $prefix . $key . "/");
      }

      $finalArray[] = $levelArray;
    } //end foreach

    return $finalArray;
  }


0 commentaires