PHP dizin yapısındaki derin özyinelemeli dizi [çoğaltmak]

4 Cevap php

Bu soru burada zaten bir cevabı var:

4 Cevap

Ben diziyi oluşturmak için DirectoryIterator kullanmanızı tavsiye

İşte gerçek hızlı birlikte attı, ama ben şu anda öyle ayıklamak için hazırlanacak bunu test etmek için bir ortam yok, bir parçacık bulunuyor.

$fileData = fillArrayWithFileNodes( new DirectoryIterator( '/path/to/root/' ) );

function fillArrayWithFileNodes( DirectoryIterator $dir )
{
  $data = array();
  foreach ( $dir as $node )
  {
    if ( $node->isDir() && !$node->isDot() )
    {
      $data[$node->getFilename()] = fillArrayWithFileNodes( new DirectoryIterator( $node->getPathname() ) );
    }
    else if ( $node->isFile() )
    {
      $data[] = $node->getFilename();
    }
  }
  return $data;
}

Herhangi bir hata işleme olmadan basit bir uygulama:

function dirToArray($dir) {
    $contents = array();
    # Foreach node in $dir
    foreach (scandir($dir) as $node) {
        # Skip link to current and parent folder
        if ($node == '.')  continue;
        if ($node == '..') continue;
        # Check if it's a node or a folder
        if (is_dir($dir . DIRECTORY_SEPARATOR . $node)) {
            # Add directory recursively, be sure to pass a valid path
            # to the function, not just the folder's name
            $contents[$node] = dirToArray($dir . DIRECTORY_SEPARATOR . $node);
        } else {
            # Add node, the keys will be updated automatically
            $contents[] = $node;
        }
    }
    # done
    return $contents;
}

Ben, PEAR File_Find paketi ile başarı elde ettik, özellikle the mapTreeMultiple() method. Sizin kod gibi bir şey olacak:

require_once 'File/Find.php';
$fileList = File_Find::mapTreeMultiple($dirPath);

Bu sizin için soruyorsun ne benzer bir dizi döndürür.

Kodunda dayanarak @soulmerge's answer. Ben sadece bazı nit ve yorumlar kaldırılır ve benim başlangıç ​​dizin gibi $startpath kullanın. (TEŞEKKÜR EDERİZ @ soulmerge!)

function dirToArray($dir) {
    $contents = array();
    foreach (scandir($dir) as $node) {
        if ($node == '.' || $node == '..') continue;
        if (is_dir($dir . '/' . $node)) {
            $contents[$node] = dirToArray($dir . '/' . $node);
        } else {
            $contents[] = $node;
        }
    }
    return $contents;
}

$r = dirToArray($startpath);
print_r($r);