Печать 1 вместо имен файлов

У меня есть некоторая коллекция изображений в моем указанном каталоге. И я хочу получить их имя с помощью функции readdir(). Но вместо того, чтобы показывать их имена, она выводит серию из 1. Как это можно сделать правильно? Я также хочу знать причину такого поведения

$dir='c:/xampp/htdocs/practice/haha/';
echo getcwd().'</br>';
if(is_dir($dir)){
echo dirname($dir);
     $file=opendir($dir);

     while($data=readdir($file)!==false){
        echo $data.'</br>';
     }

}

3 ответа

Решение

Приоритет оператора. Эта строка:

 while($data=readdir($file)!==false){

анализируется / выполняется как

 while ($data = (readdir($file) !== false))
                ^------------------------^

Обратите внимание на дополнительные скобки. $data получает логический ИСТИННЫЙ результат !== сравнение. Вам нужно переписать как

 while(($data = readdir($file)) !== false){
       ^----------------------^

Что сделаю $data получить строку, возвращенную из readdirи тогда эта строка будет сравниваться с логическим false,

Соответствующие документы: http://php.net/manual/en/language.operators.precedence.php

Вы, вероятно, можете реализовать вместо этого с scandir

function list_directory($directory) {
  $result = new stdClass();
  $result->path = $directory;
  $result->children = array();
  $dir = scandir($directory);
  foreach($dir as $file) {
    if($file == '.' || $file == '..') continue;
    $result->children[] = 
        !is_dir($directory.$file) ? $file :
            list_directory($directory.$file.'/');
  }
  return $result;
}

$dir='c:/xampp/htdocs/practice/haha/';

$result = list_directory($dir);
echo '<code><pre>';
var_dump($result);
echo '</pre></code>';

Вы можете добавить в функцию фильтр для типов файлов или ограничить глубину рекурсии и тому подобное.

$data=readdir($file)!==false

Вы устанавливаете логический результат на $data, Конечно, вы хотели сделать:

($data=readdir($file))!==false
Другие вопросы по тегам