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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Цикл foreach

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Помощь с примерами
srazil
Отправлено: 21 Августа, 2010 - 19:20:12
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




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


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
JustUserR
Отправлено: 21 Августа, 2010 - 22:44:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




srazil пишет:
У меня в трех папких эти файлы, и селекта тоже три! А нада один! Как это сделать
Для вывода списка файлов из различных каталогов в одном общем select-элементе можно использовать различные схемы постороения идентификаторов - в частности вы можете сохранить имена файлов из каждой директории в отдельный подмассив и потом сформировать их общий вывод - с некоторой системой указания принадежности файла в папки например за счет использовать относительных путей с предварительным шифрования специальных символов


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
srazil
Отправлено: 22 Августа, 2010 - 06:19:03
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




Ну хоть маленький намек на пример, я новичок в PHP.


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
JustUserR
Отправлено: 23 Августа, 2010 - 13:42:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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. }

}


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
srazil
Отправлено: 23 Августа, 2010 - 18:13:08
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




Вот что у меня получилось:
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>";
переносить выше, тогда один селект и в нем не все, остальное вылезает за селект в виде каки.


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
Uchkuma
Отправлено: 23 Августа, 2010 - 20:05:53
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




srazil пишет:
И все равно 3 селекта вместо одного.
Потому что у вас селект внутри цикла while.
srazil пишет:
Пробовал переносить выше, тогда один селект и в нем не все, остальное вылезает за селект в виде каки.
А закрывающий </select> кто будет выносить из цикла?
(Добавление)
Чтоб не мучились, поменяйте местами 26 и 27 строки.
 
 Top
srazil
Отправлено: 23 Августа, 2010 - 22:15:47
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




Все сделал теперь один селект но блин опять столкнулся с проблемой.
В селекте видны только то, что в цикле файлов а не в базе.
т.е. вижу $nix1 а должен видеть $cv_dir и если есть совпадения с $nix1 то выделить это!
беда.


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
srazil
Отправлено: 24 Августа, 2010 - 10:12:00
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




Пробовал еще так, но он теперь начал по несколько раз в одном селекте выдавать базу т.е. вместо 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.  


Вот пример моих неудач:
Скачать файл: numer.zip
Скачан раз: 147


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
isle
Отправлено: 24 Августа, 2010 - 12:40:38
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




srazil пишет:
вместо 10 пунктов селекта выдает 10 умноженное на 3 селектов


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

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

Поскольку код не очень читабельный, то сами... вынесите второй цикл "foreach($numer as $linems)" из цикла "while@? полагаю, он там вообще не к месту, тогда 1 раз будет распечатка ;)

(Отредактировано автором: 24 Августа, 2010 - 12:47:15)

 
 Top
JustUserR
Отправлено: 24 Августа, 2010 - 14:34:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




srazil пишет:
селекте видны только то, что в цикле файлов а не в базе.
Для вывода некоторой сводной информации по файлам которая доступна в БД для выбираемых файлов вы можете использовать такую схему - сначала вы считываете все значение имен файлов в том виде котором они есть и сохраняете в одномерный массив - и для него делаете запрос в БД для получения дополнительной информации и связываете ее с соответствующими идентификаторами - и после этого уже можете осуществлять вывод select-ов в которых в качестве value будет уникальное имя файла в экранированном виде - а в качестве самого показывемого значения внутри option будет информация скопированная из БД


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
srazil
Отправлено: 24 Августа, 2010 - 18:02:11
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




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. //////////////////////////////////////////////////////////////////////////////////////////  ?>

Работает как надо.


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
srazil
Отправлено: 24 Августа, 2010 - 20:47:33
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




Может кто еще такую вещь подскажет?
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;


-----
http://catalog[dot]monty74[dot]ru - Добавить сайт в каталог
 
 Top
JustUserR
Отправлено: 25 Августа, 2010 - 00:16:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB