Функция Opendir дает мне несколько массивов вместо одного - PullRequest
0 голосов
/ 18 февраля 2012

Приветствия, Старейшины кода,

Я нахожусь в поиске овладеть заклинаниями PHP, и теперь мне нужна ваша помощь в убийстве могущественного зверя.

Я делаю REST API в PHP. Одной из функций является GET, который возвращает список pngs в директории. Но вместо возврата одного массива он возвращает несколько массивов (по одному на каждую итерацию?).

Я хочу:

["1.png","2.png","3.png"]

Но я получаю:

["1.png"]["1.png","2.png"]["1.png","2.png","3.png"]

Я представляю свою жалкую функцию от презрения и унижения:

function getPics() {
$pic_array = Array(); 
$handle =    opendir('/srv/dir/pics'); 
while (false !== ($file = readdir($handle))) { 
    if ($file!= "." && $file!= ".." &&!is_dir($file)) { 
    $namearr = explode('.',$file); 
    if ($namearr[count($namearr)-1] == 'png') $pic_array[] = $file; 
    } 
echo json_encode($pic_array);
} 
closedir($handle);
}

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Вы должны сделать правильный отступ, и будет очень ясно, что случилось.Вы помещаете echo json_encode() в петлю.Это исправленная версия:

function getPics()
{
    $pic_array = Array(); 
    $handle = opendir('/srv/dir/pics'); 
    while ( false !== ($file = readdir($handle)) )
    {
        if ( $file=="." || $file==".." || is_dir($file) ) continue; 
        $namearr = explode('.',$file);
        if ($namearr[count($namearr)-1] == 'png') $pic_array[] = $file; 
    } 
    echo json_encode($pic_array);
    closedir($handle);
}

Обратите внимание, что этот способ проверки расширения не имеет небольшого недостатка, поскольку файл с именем "png" (без расширения) будет соответствовать.Есть несколько способов исправить это, например, используя pathinfo() для анализа имени файла.

ps.также не то, что это:

if ( $file=="." || $file==".." || is_dir($file) ) continue; 

можно записать как

if ( is_dir($file) ) continue; 
0 голосов
/ 18 февраля 2012

Подумай о своей петле. Вы повторяете json_encode ($ pic_array) каждый раз, когда делаете цикл. Таким образом, в первом цикле все, что у вас будет, - это первый файл, затем во втором цикле ... будут напечатаны два файла. Так далее и так далее

...