2012-02-18 2 views
0

Приветствия, сионских кода,функция Opendir дает мне несколько массивов, а не только один

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

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

Я хочу:

["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); 
} 

ответ

1

Вы должны сделать некоторые надлежащие отступы и будет очень ясно, что было не так. Вы помещаете 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() для анализа имени файла.

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

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

можно записать в виде

if (is_dir($file)) continue; 
+0

Благодарим вас за исправление и советы. Я отныне буду придерживаться надлежащего отступов. – playeren

0

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

+0

Спасибо! Json_encode теперь выходит за пределы цикла и корректно возвращает только один массив. – playeren

Смежные вопросы