Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Цикл в цикле
 
 автор: chexov   (28.05.2008 в 15:59)   письмо автору
 
 

Подскажите как сделать правильно цикл в цикле?

<?
Например в этом скрипте
$mass1 
= array('a''b''c''d');
$mass2 = array('1''b''3''d');

for (
$t=0$t<=3$t++)
  { 
  for (
$i=0$i<=3$i++)
    {
    if (
$mass2[$t]==$mass1[$i]){echo "<b>".$mass1[$i]."</b>";}
    else {echo 
$mass1[$i];}
    }
  }
?>

Выводит
abcdabcdabcdabcd

а нужно
abcd

   
 
 автор: SiM(R)   (28.05.2008 в 16:23)   письмо автору
 
   для: chexov   (28.05.2008 в 15:59)
 

Судя по коду он должен выводить то, что выводит ). И лично мне не понятно какой должен быть алгоритм. Скажите что вы должны получить и каким образом.

   
 
 автор: Zend72   (28.05.2008 в 16:24)   письмо автору
 
   для: chexov   (28.05.2008 в 15:59)
 


<?php
    
if ($mass2[$t]==$mass1[$i]){echo "<b>".$mass1[$i]."</b>";}
    else {echo 
$mass1[$i];}
?>

Так ведь тут если условие верно, то вывести $mass1[$i] и иначе вывести $mass1[$i]

   
 
 автор: Zend72   (28.05.2008 в 16:27)   письмо автору
 
   для: chexov   (28.05.2008 в 15:59)
 

Вот он четыре раза повторяется и выводит
abcdabcdabcdabcd

А для чего это нужно то?

   
 
 автор: olejek   (28.05.2008 в 16:37)   письмо автору
 
   для: Zend72   (28.05.2008 в 16:27)
 

А зачем вообще делать цикл в цикле?!

<?
foreach ($mass1 as $key=>$val)
    {
    if (
$val == $mass2[$key])
        echo 
"<b>".$val."</b>";
    else
        echo 
$val;
    }
?>

   
 
 автор: Zend72   (28.05.2008 в 16:44)   письмо автору
 
   для: olejek   (28.05.2008 в 16:37)
 

И то верно.

   
 
 автор: Zend72   (28.05.2008 в 16:37)   письмо автору
 
   для: chexov   (28.05.2008 в 15:59)
 


<? 
Например в этом скрипте 
$mass1 
= array('a''b''c''d'); 
$mass2 = array('1''b''3''d'); 

for (
$t=0$t<=3$t++) 
  {  
  for (
$i=0$i<=3$i++) 
    { 
    if (
$mass2[$t]!=$mass1[$i]){echo "<b>".$mass1[$i]."</b>";} 
    else {echo 
$mass2[$t];} 
    } 
  } 
?>

Вроде так...

   
 
 автор: chexov   (28.05.2008 в 17:12)   письмо автору
 
   для: Zend72   (28.05.2008 в 16:37)
 

у меня вот какая задача на самом деле
есть что то типа вопросника который выводит какое то количество вопросов по 4 варианта ответа ($var1, $var2, $var3, $var4) в каждом вопросе, отвечая на каждый вопрос, результат сохраняется в сессии, и имеет вид
$_SESSION['o'.$_SESSION['t']]

где $_SESSION['t'] это порядковый номер вопроса
К примеру у меня 3 вопроса

<?
for ($i=1$i<=4$i++)
  {
  for(
$z=1$z<=3$z++)
    {
    if (
$_SESSION['o'.$z]==правильный ответ(выборка из БД)){echo "<font color='red'>".$var['$i']."</font><br/>";}
    else {echo 
$var[$i]."<br/>";}
    }
  }
вот как быть?
?>

   
 
 автор: sim5   (28.05.2008 в 17:40)   письмо автору
 
   для: chexov   (28.05.2008 в 17:12)
 

Во-первых, из четырех вариантов, верный может быть только один, зачем вы тогда в примере сравниваете несколько переменных?
Во-вторых, вы это загодя знаете верный ответ, а значит знаете индек массива верного ответа. Поэтому достаточно получить номер ответа чтобы сравнить его и индексом верного ответа, и не надо никаких циклов.

   
 
 автор: chexov   (28.05.2008 в 17:53)   письмо автору
 
   для: sim5   (28.05.2008 в 17:40)
 

цикл нужен, для вывода всех вопросов и всех вариантов ответов в моем случае 3 вопроса по 4 варианта ответа в каждом
Впринипе я сделал

<?
$mass1 
= array('1''2''3''4');  
foreach (
$mass1 as $val
    { 
    if (
$_SESSION['o'.$val]== ответ) { echo "<b>".$arr['var'.$val]."</b>"; }
    else   {echo 
$arr['var'.$val]; }
    }
?>

только такой вопрос: если у меня $_SESSION['o'.$val] не 4 а 10 т.е $_SESSION['o1']...$_SESSION['o10'] а $arr['var'.$val] всегда 4 как быть?

   
 
 автор: sim5   (28.05.2008 в 17:59)   письмо автору
 
   для: chexov   (28.05.2008 в 17:53)
 

Погодите, вы каждый вопрос выводите по отдельности и затем выводите результат ответов по всем вопросам, или выводите все вопросы сразу?

   
 
 автор: chexov   (28.05.2008 в 18:07)   письмо автору
 
   для: sim5   (28.05.2008 в 17:59)
 

Это результат всего опроса, т.е после того как опрос пройден выводятся все вопросы опроса и правильные ответы выделяются жирным

<?
$q
mysql_query("select * from `table`");
while (
$arr mysql_fetch_array($q))
  {
  echo 
"<b>".$arr['quest']."</b><br/>";
  
$mass1 = array('1''2''3''4');   
  foreach (
$mass1 as $val)  
    {  
    if (
$_SESSION['o'.$val] == $arr['answ']) { echo "<b>".$arr['var'.$val]."</b>"; } 
    else   {echo 
$arr['var'.$val]; } 
    }
  }
?>

Так как быть если у меня $_SESSION['o'.$val] не 4 а 10 т.е $_SESSION['o1']...$_SESSION['o10'] а $arr['var'.$val] всегда 4

   
 
 автор: sim5   (28.05.2008 в 18:12)   письмо автору
 
   для: chexov   (28.05.2008 в 18:07)
 

И на кой ляд вам тогда цикл, да и вообще сессия, если вы получаете ответы на все сразу? Вам ведь только и осталось выдать правильно или нет, и как правильно, если ответ не верен. Подумайте сами.

   
 
 автор: chexov   (28.05.2008 в 18:20)   письмо автору
 
   для: sim5   (28.05.2008 в 18:12)
 

ВЫ что то не допонимаете, в сессию заносится ответ даный ответчиком, на каждый вопрос по сессионной переменной, т.е если в опросе 3 вопроса то в результате будет 3 сессионых перменных $_SESSION['o1'], $_SESSION['o2'], $_SESSION['o3'] это мы сравниваем с правильными ответами и если совпадает то выделяем если не совпадает то не выделяем, все предельно. Цикл мне нужен лишь для определения числа N ($_SESSION['o->N<-'] и $arr['var->N<-'] только и всего

   
 
 автор: chexov   (28.05.2008 в 18:26)   письмо автору
 
   для: chexov   (28.05.2008 в 18:20)
 

Другими словами: как мне сделать чтобы

<?
if ($_SESSION['o'.N] == $arr['answ']) { echo "<b>".$arr['var'.N]."</b>"; }  
    else   {echo 
$arr['var'.N]; }
?>

на месте N стояли разные числа например в первом N от 1 до 5 во втором и третьем N от 1 до 4

   
 
 автор: sim5   (28.05.2008 в 18:36)   письмо автору
 
   для: chexov   (28.05.2008 в 18:20)
 

Ответьте на такой вопрос - чем определяется правильный ответ? Т.е., как вы знаете, из массива вопросов, что, например, 2 из них правильный?

   
 
 автор: chexov   (28.05.2008 в 18:44)   письмо автору
 
   для: sim5   (28.05.2008 в 18:36)
 

потому что структура БД такова
`id`, `vopros`, `otvet(в цифровом значении)`, `var1`, `var2`, `var3`, `var4`
ответьте на вопрос >>(28.05.2008 в 18:26) остальное додумаю:)

   
 
 автор: sim5   (28.05.2008 в 19:53)   письмо автору
 
   для: chexov   (28.05.2008 в 18:44)
 

Я вообще не понимаю вашей кухни. Например, исходные вопросы расположены всегда так, что первый из них верный. Тогда для примера (из массива):

<?
//массив с вопросами, ключ вложенного массива определяет имя группы кнопок 
$a = array('figure' => array('Квадрат - квадрат','Квадрат - круг','Квадрат - дуга','Квадрат - линия'),
'fruit' => array('Дыня - овощ','Дыня - фрукт','Дыня - трава','Дыня - злак'));
//выводим форму теста
print "<form method=\"post\">";
foreach(
$a as $key => $val) {
  
//создаем промежуточный массив 
  
$m $val;
  
//перемешиваем случайно вопросы
  
shuffle($m);
    for (
$i=0$i<count($m); $i++) {
      
//значения кнопок равны индексу исходного массива 
      //это плохо, но это только для примера, можно поступить иначе
      
print "<input name=\"$key\" type=\"radio\" value=\"".array_search($m[$i],$val)."\">$m[$i]<br>";
    }
  print 
"<br>";
}
print 
"<input type=\"submit\" value=\"Send\"></form>";
//получаем результат и проверяем
if ($_POST) {
   foreach(
$_POST as $key => $val) {
     if (
$val 0) print "Ответ не верный, правильный ответ: ".$a[$key][0]."<br>";
        else print 
"Ответ верный<br>";
   }
}
?>

   
 
 автор: SiM(R)   (28.05.2008 в 19:48)   письмо автору
 
   для: sim5   (28.05.2008 в 18:36)
 

Попробую предложить следующие:

<?php
$val
=0// устанавливаем счетчик ( как я понимаю это номер вопроса?)
$qmysql_query("select * from `table`"); 
while (
$arr mysql_fetch_array($q)) 
  { 
  echo 
"<b>".$arr['quest']."</b><br/>";
    
$val=$val+1
    if (
$_SESSION['o'.$val] == $arr['answ']) 
                 { echo 
"<b>".$arr['answ']."</b>"; } 
    else   {echo 
$arr['answ']; }
  } 

   
 
 автор: chexov   (29.05.2008 в 04:47)   письмо автору
 
   для: SiM(R)   (28.05.2008 в 19:48)
 

ладно забудьте насчет примера конкретного и ответьте на вопрос

как мне сделать чтобы

<? 
if ($_SESSION['o'.N] == $arr['answ']) { echo "<b>".$arr['var'.N]."</b>"; }   
else   {echo 
$arr['var'.N]; } 
?> 

на месте N стояли разные числа например в первом N от 1 до 5 во втором и третьем N от 1 до 4

   
 
 автор: SiM(R)   (29.05.2008 в 06:29)   письмо автору
 
   для: chexov   (29.05.2008 в 04:47)
 

Так пойдет?

<?  
if ($_SESSION['o'.rand('1','5')] == $arr['answ']) { echo "<b>".$arr['var'.rand('1','4')]."</b>"; }    
else   {echo 
$arr['var'.rand('1','4')]; }  
?> 

Скажите, вот вот у Вас совпало значение на ответ, которое выбрал пользователь (храниться в сессии) с тем которое должно быть, что должно выводиться?? правильный ответ ?? его номер??? его порядок??? его варинат?? что содержится в столбцах var1 и тд?

   
 
 автор: chexov   (29.05.2008 в 06:33)   письмо автору
 
   для: SiM(R)   (29.05.2008 в 06:29)
 


<?   
if ($_SESSION['o'.rand('1','5')] == $arr['answ']) { echo "<b>".$arr['var'.rand('1','4')]."</b>"; }     
else   {echo 
$arr['var'.rand('1','4')]; }   
?> 

Так не пойдет, мне нужно: от 1 до 5 (до любого числа) по порядку, и: от 1до 4 тоже по порядку для этого и нужен цикл.
==================================================================
должны выводиться все варианты ответов, а совпавший с ответом - выделиться жирным

   
 
 автор: SiM(R)   (29.05.2008 в 11:22)   письмо автору
 
   для: chexov   (29.05.2008 в 06:33)
 

Вы что издеваетесь!!!!??? Тогда скрипт в вашем самом первом топике делал все правильно!!!!

в mass2 храняться ваши 4 вопроса и по каждому их них из mass1 выводятся 4 варианта ответа, при этом если совпадают, то они выделяются жирным!

   
 
 автор: chexov   (29.05.2008 в 11:50)   письмо автору
 
   для: SiM(R)   (29.05.2008 в 11:22)
 

я не спрашиваю вас как мне это вывести! я спросил
==========================================
Как сделать чтобы для $n1 было аналогично

for ($n1=1; $n1<=любое число;  $n1++)

А для $n2 было аналогично

for ($n2=1; $n2<=4;  $n2++)

В этом коде

<?    
if ($_SESSION['o'.$n1] == $arr['answ']) { echo "<b>".$arr['var'.$n2]."</b>"; }      
else   {echo 
$arr['var'.$n2]; }    
?> 

вот как выглядит результат

<?
//мои ответы в опросе
ВОПРОС1
1.вариант1 
//я ответил
2.вариант2
3.вариант3 
//правильный
4.вариант4
ВОПРОС2
1.вариант1 
//правильный
2.вариант2 //я ответил
3.вариант3
4.вариант4
ВОПРОС3
1.вариант1
2.вариант2
3.вариант3 
//я ответил и он же правильный
4.вариант4
ВОПРОС4
1.вариант1 
// я ответил
2.вариант2
3.вариант3
4.вариант4 
// правильный
?>

   
 
 автор: SiM(R)   (29.05.2008 в 12:09)   письмо автору
 
   для: chexov   (29.05.2008 в 11:50)
 

Ну, цикл который Вы написали в самом начале правильный!!! Сначала Вы там перебираете вопросы $t, а потом при $t=1 (то есть первый вопрос) вы проверяется ответы и формируется список всех вариантов ответов (тут и указывайте количество вариантов ответов, то есть в вашем случаи 4).

   
 
 автор: chexov   (29.05.2008 в 12:28)   письмо автору
 
   для: SiM(R)   (29.05.2008 в 12:09)
 

но у меня только один определенный массив $mass = array('1', '2', '3', '4') который ответственный за варианты ответов(их всегда 4), но 2 массив у меня неопределенный, т.к в опросе может быть сколько угодно вопросов хоть 1000, не буду же я прописывать массив из 1000 пунктов
if ($_SESSION['o'.N1] == $arr['answ']) { echo "<b>".$arr['var'.N2]."</b>"; }
else {echo $arr['var'.N2]; }
N1 - неопределенный
N2 - всегда от 1до4
=======================
Дайте пример кода а то я совсем уже запутался.... хоть тему новую создавай

   
 
 автор: SiM(R)   (29.05.2008 в 12:56)   письмо автору
 
   для: chexov   (29.05.2008 в 12:28)
 

Не стоит так отчаиваться ), количество вопросов легко посчитать с помощью команды count().

<?php
for ($i=1$i<=count($_SESSION['o']); $i++)
{
}
?>


Только создавайте сессии не второго уровня, а третьего. то есть не надо создавать сессии вида $_SESSION['o'.$var], Вам потом будет очень трудно с ними работать. Вместо этого делайте так: $_SESSION['o'][$var].

   
 
 автор: chexov   (29.05.2008 в 15:00)   письмо автору
 
   для: SiM(R)   (29.05.2008 в 12:56)
 

ответьте пожалуйста:

 chexov    (29.05.2008 в 04:47)   на этот пост только не rand(1, 4)

можн оподробнее а то мозг совсем закипел, мурыжим тему как портянку

   
 
 автор: BinLaden   (29.05.2008 в 15:17)   письмо автору
 
   для: chexov   (29.05.2008 в 15:00)
 

Извините, что вмешиваюсь в эту жаркую тему:)

SiM(R) Вам сделал очень верное замечание. Ни в коем случае не генерируете переменные вида $_SESSION['o'. N], используйте массивы, они для этого и предназначались.

   
 
 автор: SiM(R)   (29.05.2008 в 15:58)   письмо автору
 
   для: chexov   (29.05.2008 в 15:00)
 


<?php
session_start
();
$arr['answ']=array('tt','rwer','3');   // массив с правильными ответами
$arr['var1']=1;  $arr['var2']='tt'$arr['var3']=3;$arr['var4']='4';    // ну типа 4 варианта
$_SESSION['o']=array('tt','qq','3'); //создаете массив с ответами , получается "tt" это ответ на первый вопрос, 'qq' - ответ на второй и тд

for ($i=$i<=count($_SESSION['o'])-$i++)  // первый цикл, перебирает вопросы по очереди
{
    for (
$k=1$k<=4$k++)                               // второй цикл, предназначен для выбора варианта ответа (всего 4 варианта)
    
{
        if (
$_SESSION['o'][$i] == $arr['answ'][$i])  // итак, если ответ пользователя на данный вопрос верен , то (не зависит от $k)
        
//смотрим какой именно вариант из базы верный (первый, второй, третий или четвертый) в результате выводим жирным тот, который правильный
            
if ($arr['answ'][$i]==$arr['var'.$k]) echo "<b><font size=5>".$arr['var'.$k]."</b></font>";
            else echo 
$arr['var'.$k];
        }

        else       
// если пользователь ответил неверно на вопрос, то все варианты будут выведены без выделения
        
{
            echo 
$arr['var'.$k];
        }


    }
    echo 
'<br>'// так, для удобства, все варианты будут с новой строки
}
?>


// вот участок который нужен Вам

for ($i=0 ; $i<=count($_SESSION['o'])-1 ; $i++)  // первый цикл, перебирает вопросы по очереди
{
    for ($k=1; $k<=4; $k++)                               // второй цикл, предназначен для выбора варианта ответа (всего 4 варианта)
    {
        if ($_SESSION['o'][$i] == $arr['answ'][$i])  // итак, если ответ пользователя на данный вопрос верен , то (не зависит от $k)
        { //смотрим какой именно вариант из базы верный (первый, второй, третий или четвертый) в результате выводим жирным тот, который правильный
            if ($arr['answ'][$i]==$arr['var'.$k]) echo "<b><font size=5>".$arr['var'.$k]."</b></font>";
            else echo $arr['var'.$k];
        }

        else       // если пользователь ответил неверно на вопрос, то все варианты будут выведены без выделения
        {
            echo $arr['var'.$k];
        }


Надеюсь это то, что надо.

   
 
 автор: chexov   (29.05.2008 в 16:39)   письмо автору
 
   для: SiM(R)   (29.05.2008 в 15:58)
 

у меня не берется в массив ответы и вопросы
они выводятся из БД в цикле while читайте выше пост


<?
        
for ($r=1$r<=$_SESSION['t']; $r++)
          {
          for (
$k=1$k<=4$k++)
            {
          if (
$_SESSION['o'.$r] == $arr['otvet']){echo $k.".<font color='red'><u>".$arr['var'.$k]."</u></font><br/>";}
          else {echo 
$k.".".$arr['var'.$k]."<br/>";}
            }
          }
?>

где $_SESSION['t']= порядковый номер ответа пользователем
получается так

<? 
//мои ответы в опросе 
ВОПРОС1 
1.вариант1 
//я ответил 
2.вариант2 
3.вариант3 
//правильный 
4.вариант4 
1.вариант1 
//я ответил 
2.вариант2 
3.вариант3 
//правильный 
4.вариант4 
1.вариант1 
//я ответил 
2.вариант2 
3.вариант3 
//правильный 
4.вариант4 
1.вариант1 
//я ответил 
2.вариант2 
3.вариант3 
//правильный 
4.вариант4 
?>

и так со всеми вопросами

   
 
 автор: SiM(R)   (29.05.2008 в 17:00)   письмо автору
 
   для: chexov   (29.05.2008 в 16:39)
 

А если так:

<?php 
        
for ($r=1$r<=$_SESSION['t']; $r++) 
          { 
          echo 
'Вопрос №'.($i+1).'<br>'// Добавляем строку с номером вопроса
          
for ($k=1$k<=4$k++) 
            { 
          if (
$_SESSION['o'.$r] == $arr['otvet']){echo $k.".<font color='red'><u>".$arr['var'.$k]."</u></font><br/>";} 
          else {echo 
$k.".".$arr['var'.$k]."<br/>";} 
            } 
          } 
?>


Насчет БД и так далее - я не знаю откуда вы берете данные и как их доводите. Я предлагаю какой-то вариант, а Вы уже должны сами его интегрировать с вашим проектом. Я всего предусмотреть не могу. Создавайте какой-нибудь массив в цикле while, а потом его используйте в данном цикле.

   
 
 автор: BinLaden   (29.05.2008 в 20:39)   письмо автору
 
   для: chexov   (29.05.2008 в 16:39)
 

chexov, значит надо все переписывать.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования