J'ai une gamme de cordes de chemin de fichier comme celle-ci p>
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/ p>
3 Réponses :
Tout d'abord, je créerais une fonction récursive pour itérer votre répertoire dans un tableau , puis émettez la matrice avec json_encode code> p> > Source utilisée à partir de: http://www.php.net/manual/ fr / fonction.readdir.php # 87733 p> p>
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
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 '] }';
?>
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 CODE>
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;
}
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.