Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Цикл foreach
Форумы портала PHP.SU » PHP » Программирование на PHP » Цикл foreach

Страниц (1): [1]
 

1. srazil - 21 Августа, 2010 - 19:20:12 - перейти к сообщению
Вот мой скрип он сравнивает файлы.
Первый с базой (он один!)
И следующие с чем сравнить и если есть одинаковые то жирным селект сделать
вот почти рабочий код:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. $path = 'asd';
  5. $numer=file('number.dat');
  6.  
  7. //for($n=0;$n<count($numer);$n++)$numer[$n]=trim($numer[$n]);
  8.  
  9. $dir_handle = @opendir($path) or die("Unable to open $path. Check if it's readable.");
  10.  
  11.  
  12. while ($dir = readdir($dir_handle)) {
  13. if($dir == '.' || $dir == '..')
  14. continue;
  15. echo "<select name=\"qwerty\" class=\"qwerty\">
  16. <option value=\"\" selected=\"selected\"> - Выберите -</option>";
  17. $nix1=file(''.$path.'/'.$dir.'/base.dat');
  18.  
  19.  
  20. foreach($nix1 as $linem)
  21. {
  22. $linem=trim($linem);
  23. $explm=explode("|",$linem);
  24. $nix[]=$explm[0];
  25. }
  26.  
  27.  
  28. foreach($numer as $linems)
  29. {
  30. $linems=trim($linems);
  31. $ex=explode("|",$linems);
  32. if (in_array($linems,$nix)) {
  33.  
  34. echo"<option style='font-weight:bold' value='$linems'> - $linems -$explm[1] </option>"; }
  35. else {echo"<option value='$linems'> - $linems- </option>";}
  36. }
  37.  
  38. echo "</select>";
  39. }
  40.  
  41.  
  42. closedir($dir_handle);
  43. ?>
  44.  

У меня в трех папких эти файлы, и селекта тоже три! А нада один! Как это сделать?
В файле почти рабочий пример.
http://www[dot]wr-script[dot]ru/forum/files/options[dot]zip
2. JustUserR - 21 Августа, 2010 - 22:44:54 - перейти к сообщению
srazil пишет:
У меня в трех папких эти файлы, и селекта тоже три! А нада один! Как это сделать
Для вывода списка файлов из различных каталогов в одном общем select-элементе можно использовать различные схемы постороения идентификаторов - в частности вы можете сохранить имена файлов из каждой директории в отдельный подмассив и потом сформировать их общий вывод - с некоторой системой указания принадежности файла в папки например за счет использовать относительных путей с предварительным шифрования специальных символов
3. srazil - 22 Августа, 2010 - 06:19:03 - перейти к сообщению
Ну хоть маленький намек на пример, я новичок в PHP.
4. JustUserR - 23 Августа, 2010 - 13:42:47 - перейти к сообщению
srazil пишет:
Ну хоть маленький намек на пример, я новичок в PHP.
Для того чтобы реализовать единый select-элемент в котором будут указаны файлы из различных каталогов - можно использовать различные варианты их однозначной идентификации В частности если у вас есть некоторая БД со список файлов и дополнительными сведениями к нем - то возможно просто указывать уникальные идентификаторы - но в общем случае достаточно использования относительного файлового пути в каталоге виртуального хоста При использовании последнего варианта после совершения передачи пользователем формы с выбранными файлами - необходимо осуществить предварительную проверку на наличие их в исходном списке поскольку на клиентской стороне их можно подменить
Можно привести к примеру очень простой вариант в котором выводятся файлы из различных папок
PHP:
скопировать код в буфер обмена
  1. foreach(array(1,2,3) as $cv_dir)
  2. {foreach($cv_dir as $cv_file)
  3. {echo "<option value=\"$cv_dir\\$cv_file\">$cv_dir - $cv_file</option>";
  4. }
  5. }

}
5. srazil - 23 Августа, 2010 - 18:13:08 - перейти к сообщению
Вот что у меня получилось:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP //////////////////////////////////////////////////////////////////////////////////////
  3. //Define path
  4. $path = 'asd';
  5. $cv_dir=file('number.dat'); // С чем сравнивать
  6.  
  7. //Open the folder
  8. $dir_handle = @opendir($path) or die("Unable to open $path. Check if it's readable.");
  9.  
  10. //Loop through dirs
  11. while ($dir = readdir($dir_handle)) {
  12. if($dir == '.' || $dir == '..')
  13.    continue;
  14. echo "<select name=\"qwerty\" class=\"qwerty\">
  15.         <option value=\"\" selected=\"selected\"> - Выберите -</option>";
  16. $nix1=file(''.$path.'/'.$dir.'/base.dat'); // Что сравнивать
  17.  
  18.       foreach(array($nix1) as $cv_dir)
  19.       {foreach($cv_dir as $cv_file)
  20.       {echo "<option value=\"$cv_dir\\$cv_file\">$cv_dir - $cv_file</option>";
  21.  
  22.       }
  23.  
  24. }
  25.  
  26. echo "</select>";
  27. }
  28.  
  29. //Close
  30. closedir($dir_handle);
  31. //////////////////////////////////////////////////////////////////////////////////////////  ?>
  32.  


И все равно 3 селекта вместо одного. Пробовал
PHP:
скопировать код в буфер обмена
  1. echo "<select name=\"qwerty\" class=\"qwerty\">
  2.         <option value=\"\" selected=\"selected\"> - Выберите -</option>";
переносить выше, тогда один селект и в нем не все, остальное вылезает за селект в виде каки.
6. Uchkuma - 23 Августа, 2010 - 20:05:53 - перейти к сообщению
srazil пишет:
И все равно 3 селекта вместо одного.
Потому что у вас селект внутри цикла while.
srazil пишет:
Пробовал переносить выше, тогда один селект и в нем не все, остальное вылезает за селект в виде каки.
А закрывающий </select> кто будет выносить из цикла?
(Добавление)
Чтоб не мучились, поменяйте местами 26 и 27 строки.
7. srazil - 23 Августа, 2010 - 22:15:47 - перейти к сообщению
Все сделал теперь один селект но блин опять столкнулся с проблемой.
В селекте видны только то, что в цикле файлов а не в базе.
т.е. вижу $nix1 а должен видеть $cv_dir и если есть совпадения с $nix1 то выделить это!
беда.
8. srazil - 24 Августа, 2010 - 10:12:00 - перейти к сообщению
Пробовал еще так, но он теперь начал по несколько раз в одном селекте выдавать базу т.е. вместо 10 пунктов селекта выдает 10 умноженное на 3 селектов. Но хоть начал жирным выделять то с чем сравнивать.
Вот пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP //////////////////////////////////////////////////////////////////////////////////////
  3. //Define path
  4. $path = 'asd';
  5. //Open the folder
  6. $dir_handle = @opendir($path) or die("Unable to open $path. Check if it's readable.");
  7.   echo "<select name=\"qwerty\" class=\"qwerty\">
  8.         <option value=\"\" selected=\"selected\"> - Выберите -</option>";
  9. //Loop through dirs
  10. while ($dir = readdir($dir_handle)) {
  11. if($dir == '.' || $dir == '..')
  12.    continue;
  13. /////////////////////////////// Беда началась
  14. $nix=file(''.$path.'/'.$dir.'/base.dat'); // Что сравнивать ($dir содержит множество папок в которых находятся base.dat)
  15.       $im=0;
  16.  
  17.       foreach($nix as $linem)
  18.         {
  19.           $linem=trim($linem);
  20.           $explm=explode("|",$linem);
  21.           $im++;
  22.  
  23. $numer=file('number.dat'); // С чем сравнивать
  24.  
  25.       $ims=0;
  26.       foreach($numer as $linems)
  27.         {
  28.           $linems=trim($linems);
  29.           $explms=explode("|",$linems);
  30.     $num_nomer=count($explms);
  31.     $x_nomer=0-1;
  32.   while ($x_nomer++<$num_nomer) {
  33.   if ($x_nomer==$num_nomer) break;
  34.   if ($explm[0]==$explms[$x_nomer]) {echo"<option style='font-weight:bold' value='$explms[$x_nomer]'> - $explms[$x_nomer] - </option>";} else {
  35. echo"<option  value='$explms[$x_nomer]'> - $explms[$x_nomer] - </option>";}
  36.           $ims++; }
  37.         }
  38.  
  39. ///////////////////////////// Беда закончилась!
  40.         }
  41.  
  42. }
  43.   echo "</select>";
  44. //Close
  45. closedir($dir_handle);
  46. //////////////////////////////////////////////////////////////////////////////////////////  ?>
  47.  


Вот пример моих неудач:
9. isle - 24 Августа, 2010 - 12:40:38 - перейти к сообщению
srazil пишет:
вместо 10 пунктов селекта выдает 10 умноженное на 3 селектов


Видимо, это потому, что вы используете один цикл (foreach) внутри другого (while) - подумайте над логикой...

Если требуется именно так (?) логику строить, тогда внутри цикла foreach нужно еще раз проверить: существует ли ключ массива, либо такое значение массива, если да, то заново не добавлять.

Поскольку код не очень читабельный, то сами... вынесите второй цикл "foreach($numer as $linems)" из цикла "while@? полагаю, он там вообще не к месту, тогда 1 раз будет распечатка ;)
10. JustUserR - 24 Августа, 2010 - 14:34:00 - перейти к сообщению
srazil пишет:
селекте видны только то, что в цикле файлов а не в базе.
Для вывода некоторой сводной информации по файлам которая доступна в БД для выбираемых файлов вы можете использовать такую схему - сначала вы считываете все значение имен файлов в том виде котором они есть и сохраняете в одномерный массив - и для него делаете запрос в БД для получения дополнительной информации и связываете ее с соответствующими идентификаторами - и после этого уже можете осуществлять вывод select-ов в которых в качестве value будет уникальное имя файла в экранированном виде - а в качестве самого показывемого значения внутри option будет информация скопированная из БД
11. srazil - 24 Августа, 2010 - 18:02:11 - перейти к сообщению
isle пишет:
Поскольку код не очень читабельный, то сами... вынесите второй цикл "foreach($numer as $linems)" из цикла "while@? полагаю, он там вообще не к месту, тогда 1 раз будет распечатка ;)


Благодарю всех за помощь, все хоть по немного помогли!
Вот именно то, что мне было нужно:

PHP:
скопировать код в буфер обмена
  1. <?PHP //////////////////////////////////////////////////////////////////////////////////////
  2. //Define path
  3. $path = 'asd';
  4.  
  5. $numer=file('number.dat');
  6.  
  7. //Open the folder
  8. $dir_handle = @opendir($path) or die("Unable to open $path. Check if it's readable.");
  9.  
  10. echo "<select name=\"qwerty\" class=\"qwerty\">
  11.         <option value=\"\" selected=\"selected\"> - Выберите -</option>";
  12.  
  13. //Loop through dirs
  14. while ($dir = readdir($dir_handle)) {
  15. if($dir == '.' || $dir == '..')
  16.    continue;
  17.  
  18. $nix1=file(''.$path.'/'.$dir.'/base.dat');
  19.  
  20.  
  21.       foreach($nix1 as $linem)
  22.         {
  23.           $linem=trim($linem);
  24.           $explm=explode("|",$linem);
  25.           $nix[]=$explm[0];
  26.         }
  27.  
  28.  
  29. } // End while
  30.  
  31.       foreach($numer as $linems)
  32.         {
  33.           $linems=trim($linems);
  34.  
  35. if (in_array($linems,$nix)) { echo"<option style='font-weight:bold' value='$linems'> - $linems- </option>";}
  36. else {echo"<option  value='$linems'> - $linems -</option>"; }
  37.         }
  38.  
  39. echo "</select>";
  40.  
  41. //Close
  42. closedir($dir_handle);
  43. //////////////////////////////////////////////////////////////////////////////////////////  ?>

Работает как надо.
12. srazil - 24 Августа, 2010 - 20:47:33 - перейти к сообщению
Может кто еще такую вещь подскажет?
PHP:
скопировать код в буфер обмена
  1. //Open the folder
  2. $dir_handle = @opendir($path) or die("Unable to open $path. Check if it's readable.");
  3.  
  4. //Loop through dirs, and display the modules
  5. while ($dir = readdir($dir_handle)) {
  6. if($dir == '.' || $dir == '..')
  7.    continue;
  8. // replace dir
  9. //////////////
  10. //Тут рисуется некая таблица которая лежит в папкаХ с названием дат (к примеру 2010-05-01 и т.д.)
  11. //////////////
  12. //Close
  13. closedir($dir_handle);
  14.  


Естественно понятно, что $dir содержит в себе эти названия.
Вопрос в следующим как можно отсортировать по возрастанию или убыванию $dir, собственно тут главное сам смысл. Сам прбовал
sort($dir); - не помогло
usort
rsort
Пробую сортировать сразу после continue;
13. JustUserR - 25 Августа, 2010 - 00:16:36 - перейти к сообщению
srazil пишет:
Вопрос в следующим как можно отсортировать по возрастанию или убыванию $dir, собственно тут главное сам смысл. Сам прбовал
В приведенной вами части PHP-кода для реализации вывода директорий в соответствии с некоторой сортировкой - необходимо организовать их предварительное сохранение в массив для которого уже будет выполняться упорядочивание элементов - то есть при считывании содержимого папки $dir=readdir($dir_handle) вы осуществляете добавление полученного значения в массив $arr[]=$dir - и после окончания цикла вы осуществляете сортировку массива $arr функцией типа sort или usort с собственным условием и производите дальнейший вывод с обрамление требуемыми строковыми константами Если вы хотите огранизовать ресурсивное чтение всех вложенных файлов и директорий с их последующей сортировкой - то можете произвести аналогичную операцию в заменой линейного массива на древесную структуру

 

Powered by ExBB FM 1.0 RC1