Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
6 / 6 / 3
Регистрация: 20.04.2012
Сообщений: 303

Выходит из цикла FOR раньше времени

05.07.2016, 12:39. Показов 1101. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Непонятное поведение кода. Цикл FOR строго задан от 0 до 3, но выходит раньше если в этом цикле доходит до одной из функций:

Например есть массив $File_Exts = Array ( [doc1] => Array ( [0] => html [1] => pdf [2] => eee [3] => sss )
Есть папка с файлами doc1.html, doc1.pdf, doc1.html.sss, doc1.html.sss.eee
$dir_path - путь к папке
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
for ($j = 0; $j < count( $File_Exts['doc1'] ); $j++)   
{
      $ext = $File_Exts['doc1'][$j];
 
   If ( ( $ext == 'doc' || $ext == 'pdf' || $ext == 'html' || $ext == 'eee' || $ext == 'sss' ) && file_exists( $dir_path )  )
        {
          if ( $ext == 'eee' )
          {
            $file_name = findEEEFileName($dir_path, 'doc1' );
            $file_name = substr($file_name, 0, strpos($file_name, '.eee'));     
          }
                
          if ( $ext == 'sss' )
          {
            $file_name = findSSSFileName($dir_path, 'doc1' );
            $file_name = substr($file_name, 0, strpos($file_name, '.sss'));         
          }
            
          $path = "$dir_path$file_name.$ext";
      print($path.'<br>');
 
      } //IF $ext ==
}
 
 
function findEEEFileName($dir, $file_name)
{
  $needed_fname = ''; 
  if ( is_dir( $dir ) )
    {
      $handle = opendir($dir);
      while (false !== ($file = readdir($handle))) 
        { 
           if ($file != "." && $file != "..") 
         { 
        if ( strstr( $file, $file_name.'.' ) && strstr( $file, '.eee' ) && strpos($file, $file_name.'.') === 0 )
           {
              $needed_fname = $file;
              break;
            }
          } 
     } 
    closedir($handle); 
     }
return $needed_fname;
}
 
function findSSSFileName($dir, $file_name)
{
  $needed_fname = ''; 
    if ( is_dir( $dir ) )
      {
        $handle = opendir($dir);
        while (false !== ($file = readdir($handle))) 
          { 
            if ($file != "." && $file != "..") 
            { 
          if ( strstr( $file, $file_name.'.' ) && strstr( $file, '.sss' ) && strpos($file, $file_name.'.') === 0 )
        {
          $needed_fname = $file;
          break;
        }
         } 
       } 
    closedir($handle); 
      }
return $needed_fname;
}
Ожидаемый результат:
/docs/doc1.html
/docs/doc1.pdf
/docs/doc1.html.sss.eee
/docs/doc1.html.sss

Функции отрабатывают нормально, находят файлы с конечним расширением ".sss" или ".eee" и возвращают их имена.
Но когда цикл доходит до подобного файла, то это его последний шаг!

В моем случае результат будет:
/docs/doc1.html
/docs/doc1.pdf
/docs/doc1.html.sss.eee

так как дошел до $File_Exts[2] а это "eee", выполнил функцию findEEEFileName, фернул имя, распечатал имя и вышел из FOR'a.
Если в массиве $File_Exts поставить на первое место "sss" либо "eee", то он сделает всего 1 шаг.

P.S. удаление break; в функциях не имеет смысла и не помогло!

Почему так может происходить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2016, 12:39
Ответы с готовыми решениями:

Цикл заканчиваеться раньше времени.
В общем такая ситуация: делаю вывод товаров из БД, в случае вывода таблицы 3 на 4 на каждой странице исчезает по 2 товара, при увеличении...

Выполняет правило раньше времени
Всем доброго времени суток. Прошу помощи. Почему то не правильно выполняет. Дата еще не наступила, а уже обновляет. $usid =...

Проверка на корректный ввод. Выходит из цикла раньше времени
Хочется чтобы код заставлял вводить юзера снова и снова пока тот не ввидет корректный инпут. А у меня получается что он просто проверяет...

2
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
05.07.2016, 15:39
mikh, а если так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
$dir_path = '';
$file_name = '';
$File_Exts = [ 'doc1' => ['html', 'pdf', 'eee', 'sss']];
 
foreach($File_Exts['doc1'] as $ext) {
 
    if (!file_exists( $dir_path ))
        break;
    if (!in_array($ext, ['doc', 'html', 'pdf', 'eee', 'sss']))
        continue;
    if (in_array($ext,['eee', 'sss']))
    {
        $file_name = findFileName($dir_path, 'doc1' , ".$ext");
        $file_name = substr($file_name, 0, strpos($file_name, ".$ext"));
    }
 
    $path = "$dir_path$file_name.$ext";
    print($path.'<br>');
}
 
 
function findFileName($dir, $file_name, $ext)
{
    if ($ext{0} !== '.') {
        $ext = '.' . $ext;
    }
    $needed_fname = '';
    if ( is_dir( $dir ) )
    {
        $handle = opendir($dir);
        while (false !== ($file = readdir($handle)))
        {
            if (in_array($file,[".", ".."])) continue;
            if ( strstr( $file, $ext ) && strpos($file, $file_name.'.') === 0 )
            {
                $needed_fname = $file;
                break;
            }
        }
        closedir($handle);
    }
    return $needed_fname;
}
0
6 / 6 / 3
Регистрация: 20.04.2012
Сообщений: 303
05.07.2016, 16:02  [ТС]
Спасибо за рефакторинг. Все работает!
Но я все равно не могу понять почему выходит из цикла в моем коде?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2016, 16:02
Помогаю со студенческими работами здесь

Программа выходит из цикла раньше
Здравствуйте. Есть цикл, но программа выходит из него раньше чем выполнится условие zak1 &lt; 0 (значение zak1 = 67), переменная daynorm...

Закрывается раньше времени
Задача: Дана действительная матрица размером n × m, все элементы которой различны. В каждой строке выбирается элемент с наименьшим...

Выход из цикла происходит раньше, чем предполагалось
#include&lt;iostream&gt; using namespace std; void main() { char ar={&quot;1234567890qwertyuiop&quot;},m='3',n='u'; cout&lt;&lt;ar&lt;&lt;'\n'; for...

Секундомер вылетает раньше времени
Здравствуйте. Так получилось, что мне в моей программе потребовался секундомер, для обратного отчета времени. Пользователь в программе...

Sleep срабатывает раньше времени
дана следующая задача в Buildere: при нажатии ентера на текущей форме должно пропасть 2 надписи, появится 1, провисеть 2 секунды...после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru