PHP SPL RecursiveDirectoryIterator - путь getPath и ltrim - PullRequest
1 голос
/ 10 октября 2011

n00b здесь, наберитесь терпения:)

Мне нужно получить список jpgs из моего каталога изображений и сделать так, чтобы имена его подкаталогов отображались как класс div CSS для данного изображения.Я могу заставить это работать, но я не могу понять, как получить только имя вложенного каталога в качестве класса div без какого-либо пути, ведущего к нему.т.е.

путь к изображению: images2 / food / hotdog.jpg Мне нужно: <div class="food"><a href="images2/food/hotdog.jpg">

Ниже работает, но не создает массив, я получаю только одно изображение.Если я удалю свои $ path и $ folder попытке, и получу $ thelist. = 'GetPath ().'это работает, но я получаю <div class="images2/food">, и мой JavaScript не нравится это.

Вот мой код:

<?php
$it = new RecursiveDirectoryIterator('images2');
$display = Array ( 'jpeg', 'jpg' );
foreach(new RecursiveIteratorIterator($it) as $file)

if ( In_Array ( SubStr ( $file, StrrPos ( $file, '.' ) + 1 ), $display ) == true )

$path = $file->getPath();
$folder = ltrim($path, "/images2");

$thelist .= '<div class="'.$folder.'"><a href="'.$file->getPath().'/'.$file->getFilename().'"rel="shadowbox['.$file->getPath().']">'.'<img src="../slir/w180-h180-c1:1/test/isotope/'.$file->getPath().'/'.$file->getFilename().'" /></a></div>'; 

?>    

<?=$thelist?>

Ответы [ 3 ]

1 голос
/ 10 октября 2011

AndrewR уже представил решение, которое вы можете использовать.Это не обрабатывает два крайних случая все же.Что если расширение вашего файла "JPG"?Что если ваш файл вообще не имеет расширения?

<?php
$theList = ''; // initialize the variables you're using!
$allowed = array("jpg" => true, "jpeg" => true);
$it = new RecursiveDirectoryIterator('images2');
$rit = new RecursiveIteratorIterator($it);
foreach ($rit as $file) {
  $pos = strrpos($file, '.');
  if ($pos === false) {
    // file doesn't contain a . (has no extension)
    continue;
  }
  // file might be named foo.JPG (sadly quite common for windows / certain cameras)
  $extension = strtolower(substr($file, $pos+1));
  if (!isset($allowed[$extension])) { // this is a bit faster than in_array()
    // $extension is not allowed
    continue;
  }

  // what happens with your class, when you encounter a sub-directory like images2/my-images/easter-holidays/foo.jpg
  // that won't be accessible from CSS (without major escaping action)
  // try to keep classNames alphanumeric (like-this-class-name)
  $path = $file->getPath();
  $folder = ltrim($path, "images2/");

  // always, ALWAYS, respect the context! 
  // htmlspecialchars() go around any non-literal output you make!
  $thelist .= '<div class="' . htmlspecialchars($folder) . '"><a href="'
    . htmlspecialchars($file->getPath()) . '/' . htmlspecialchars($file->getFilename()) 
    . '"rel="shadowbox[' . htmlspecialchars($file->getPath()) . ']">' 
    . '<img src="../slir/w180-h180-c1:1/test/isotope/' . htmlspecialchars($file->getPath()) 
    . '/' . htmlspecialchars($file->getFilename()) . '" /></a></div>';
}
1 голос
/ 30 января 2013

Protip: расширения файлов так же просто, как:

end(explode(".", $path));

Итак, давайте:

$ite = new RecursiveDirectoryIterator("/mnt/shared/Media/Music/");
// Here are some extensions I want to keep
$keepers = array('ogg', 'mp3', 'wav', 'flac');
foreach (new RecursiveIteratorIterator($ite) as $filename => $cur) {
    // This bit of magic lowercases the file extension by grabbing everything past the last
    // '.' and checking whether said string is within the $keepers array, otherwise we just
    // skip this iteration and go on to the next.
    if (!in_array(end(explode(".", strtolower($filename))), $keepers)) { continue; }
    // Every $filename past here is fine as wine
    doit($filename); // :D
}
1 голос
/ 10 октября 2011

Кажется, вам просто не хватает фигурных скобок.Вы должны поместить все, что хотите, в цикл foreach внутри фигурных скобок.То же самое с оператором if.Без фигурных скобок к предыдущему выражению применяется только следующая строка.

Кроме того, я думаю, что ваш параметр для вашего выражения ltrim должен быть "images2 /".

<?php
$it = new RecursiveDirectoryIterator('images2');
$display = Array ( 'jpeg', 'jpg' );
foreach(new RecursiveIteratorIterator($it) as $file)
{
    if ( In_Array ( SubStr ( $file, StrrPos ( $file, '.' ) + 1 ), $display ) == true )
    {
        $path = $file->getPath();
        $folder = ltrim($path, "images2/");

        $thelist .= '<div class="'.$folder.'"><a href="'.$file->getPath().'/'.$file->getFilename().'"rel="shadowbox['.$file->getPath().']">'.'<img src="../slir/w180-h180-c1:1/test/isotope/'.$file->getPath().'/'.$file->getFilename().'" /></a></div>'; 
    }
}

?>    

<?=$thelist?>
...