У меня есть некоторая коллекция изображений в моем указанном каталоге. И я хочу получить их имя с помощью функции 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>';
}
}
Приоритет оператора. Эта строка:
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