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

Форум PHP

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

 

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

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

тема: как проверить массив
 
 автор: *m*   (09.06.2009 в 20:40)   письмо автору
 
 

привет всем.

как проверить массив функцией isset?

нашол следующий синтаксис:

<?
if(isset ($array_name)) { // трам пам пам..
?>


но если делаю так:

<?
if(isset ($array_vopros1) and ($array_vopros2)) {echo $vopros1[/*тут значение переменной*/];
echo 
$vopros2[/*тут значение переменной*/];}
?>

не работает (

  Ответить  
 
 автор: sim5   (09.06.2009 в 20:56)   письмо автору
 
   для: *m*   (09.06.2009 в 20:40)
 

ISSET не проверяет массивы, она сообщает установлена ли переменная или нет.
<?
//тут второй массив пуст, но объявлен
$a = array(1,2);
$b = array();
if (isset(
$a) && isset($b)) echo "OK";
//условие выполняется

//а вот так, условие не выполнится
if ($a && $b) echo "OK";
//если заполнить массив $b, будет ОК
$a = array(1,2);
$b = array(2,3);
if (
$a && $b) echo "OK";

Видимо вам не с опроса надо начинать, а с простейших примеров работы с выражениями, операторами и т.д..

  Ответить  
 
 автор: *m*   (09.06.2009 в 23:06)   письмо автору
 
   для: sim5   (09.06.2009 в 20:56)
 

за подробное разъяснение спасибо, буду знать.

иссетом, просто в голову пришло проверить в сети нашол и синтаксис, потому и вопрос так поставил.

>Видимо вам не с опроса надо начинать, а с простейших примеров работы с выражениями, операторами и т.д..

а то что я спрашиваю, разве не простейшие примеры? тогда что мешает учиться на реальных задачах?)

вобщем
основная проблема в другом, я с помощью проверки массивов, хотел сделать в конце проверку и если масивы существуют, а они существуют, потомучто, по мере отправки форм в их значения помещаются как раз значения глобального массива пост

<?
$vopros1 
= array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант");
$val = ($_POST['question1']);
echo 
$vopros1[$val];
// и так для каждого вопроса соответсвенно $vopros2 = array и т.д.
?>

но вот проблема в том что после отправки следующей формы, данные из масивов куда-то теряются.. (отмечу что все формы и обработчик находяться в одном файле) для проверки в конце написал следующее:

<?
if(isset($vopros1)and($vopros2)) {
echo 
"массивы следущие ниже существуют но данные не выводяться";
echo 
$vopros1[$val];
echo 
$vopros2[$val];}
?>


почему? тоесть если выводить инфу из масива сразу после того как туда попала информация, то все работает, если в конце опроса, то не выводиться информация. в чем подвох?

  Ответить  
 
 автор: nikita2206   (10.06.2009 в 01:21)   письмо автору
 
   для: *m*   (09.06.2009 в 23:06)
 

я у вас спрашивал почему трава зеленая?
приводите код…

  Ответить  
 
 автор: sim5   (10.06.2009 в 07:18)   письмо автору
 
   для: *m*   (09.06.2009 в 23:06)
 

Я всегда говорил, и буду настаивать, что работу нужно начинать не с поисков isset и прочих инструментов, а с идеи, с замысла, руководствуясь принципом от общего к частному. Вам не "приходить в голову" должно, а исходя из замысла своего (поставленной задачи), вы должны выбирать из набора инструментов те, которые и необходимы для ее решения.
Но чтобы выбрать их, вы должны хорошо знать для чего служат те или иные инструменты, как они работают. Без этих знаний вы не сдвинитесь ни на шаг. А это понимание может быть только в том случае, если вы умеете мыслить логически, ну или хотя бы в правильном направлении, сопоставляя логику задачи с логикой работы инструментов.

я с помощью проверки массивов, хотел сделать в конце проверку и если масивы существуют...
А что вы делаете на самом деле? Если разобрать ваше условие:
if(isset ($array_vopros1) and ($array_vopros2))
то ваше условие гласит: если существует массив $array_vopros1, при чем не важно пуст он или нет, и массив $array_vopros2, при чем он должен не просто существовать, но и обязательно быть заполненным. Другими словами, вы хотите одно, а проверяете совсем другое. Вы не понимаете в этом случае как правильно применить isset, думая, что он объявлен у вас сразу для двух переменных. Это незнание элементарного, а достаточно было заглянуть за знаниями в мануал.

Естественно данные и будут теряться, и вас это не должно было удивлять. Вы в своем скрипте создаете, например, переменную А, присваивая ей значение полученное из формы. Такова логика работы вашего РНР-сценария. При следующей отправке формы будет выполняться это же самое - создаваться переменная А, и ей присваивается значение из формы, но уже новое (либо она просто инициализируется, так как новые значения предназначаются уже для переменной В), а предыдущее теряется, ибо оно нигде не было сохранено. В этом случае помогла бы, например, сессия. Но давайте посмотрим вот на что.

Возвращаясь к словам своим о правильной постановке задачи (идее, замысле), утверждаю, что вы явно не в полной мере представляете ее себе, другими словами, вы не понимаете как должен работать ваш опрос, и что для этого потребуется. А если абстрагироваться от РНР, и представить себя на месте статиста, которому нужно узнать о предпочтениях группы людей?
Что вам для этого потребуется?
1. Набор вопросов (групп вопросов).
А как вы будете вести учет интересов?
Вариант 1. Сегодня отметили интерес одного и забыли о нем.
Вариант 2. Вы суммируете число выбора у каждого из вопросов, каждый день.
А как не забыть всю статистику?
1. Просто - записывать результат карандашиком на листике напротив каждого из вопросов.

А теперь вернитесь в РНР и подумайте, что вам потребуется для сбора этой статистики. В РНР "листиком" может служить либо база данных, либо отдельный файл. Из этого "листика" вы будете получать сами вопросы, а также отмечать в нем выбранные варианты. Если статистика нужна только об интересах одного человека (вариант 1), то достаточно сессии, если вариант 2, то лучше хранить в файле (базе).

Как должна выглядеть структура ваших вопросов? Видимо удобно будет хранить их в виде таких строк: Вопрос 1 - Выбран/не выбран/сколько раз выбран; Вопрос 2 - Выбран/не выбран/сколько раз выбран; и т.д.. А это значит, что все это лучше хранить в виде массива. Получая форму от пользователя с вариантом выбора, вы не записываете массив, а изменяете (суммируете) в уже существующем массиве ячейки (столбцы в массиве), которые несут информацию о варианте выбора, то есть, например, по умолчаю 0, вы заменяете на 1 у выбранного варианта (строки в массиве), и постоянно суммируете их, если это статистика с накоплением.
Массив же можно сериализовать и записать в файл для хранения, а при работе делать обратную операцию, для получения исходного массива вопросов/результатов. При этом, этот массив на время работы сессии удобно загружать в нее, и работать с ней, а по окончании, сериализовать и опять записывать в файл. Большую гибкость и удобство обеспечивает база данных.

  Ответить  
 
 автор: nikita2206   (10.06.2009 в 12:10)   письмо автору
 
   для: sim5   (10.06.2009 в 07:18)
 

о как умно! +1

  Ответить  
 
 автор: *m*   (11.06.2009 в 13:07)   письмо автору
 
   для: sim5   (10.06.2009 в 07:18)
 

спасибо за столь развернутый ответ) не могу не согласиться с вами, но мне потому и интресно изучать язык на реальных задачах , знаний действительно пока очень мало и они поверхностные, но с каждым днем прокачиваются навыки и понимание,и во многом благодаря этому форуму)

решил остановиться на сессиях, они наиболее подходят.


<? session start();

//форма с вопросом, получаем из нее данные и помещаем их в переменную
$value = ($_POST['vopros1']);

//Помещаем значение переменной в сессию
$_SESSION['value'] = $value;

//заносим данные в массив
$vopros1 = array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант"); 

//Помещаем массив в сессию
$_SESSION['vopros1'] = $vopros1;

// и т.д. для всех вопросов.


теперь имеем знанчение и массив сохранные в сессии, но как теперь сделать чтобы выводился выбранный пользователем вариант??

  Ответить  
 
 автор: sim5   (11.06.2009 в 13:27)   письмо автору
 
   для: *m*   (11.06.2009 в 13:07)
 

Я же вам писал, что удобно будет деражать впоросы сразу со значением - выбрано/не выбрано. То есть, удобно иметь такой массив, типа:
номер вопроса => содержимое вопроса, вариант => массив(1=>(вариант 1, 0), (вариант 2, 0), (вариант 3, 0)).... и т.д..
Вы получив номер выбранного варианта устанавливаете в соответствующей ячейке массива 1, вместо 0. Это и будет служить признаком выбора. Тперь достаточно выести масиив этот, указывая выбранными те варианты, у которых индекс 1 равен 1.
Номер вопроса упростит доступ к нужному элементу массива - передавать $_POST['vopros1'], $_POST['vopros2'] и т.п., не есть гут.
Подумайте еще немного, коли вы учитесь.

  Ответить  
 
 автор: *m*   (11.06.2009 в 13:53)   письмо автору
 
   для: sim5   (11.06.2009 в 13:27)
 

вы наверное намекаете, что можно масив создавать сразу из значения переменной формы:

<input type="text" name="vopros1[ ]" value="1">

но такой вариант мне не подходит, поскольку еще суммируются значения всех ответов

<input type="text" name="vopros2" value="<? echo ($_POST['vopros1'])?>">

поэтому я и хочу.., как бы вытакскивать в массивы первоначальные значения, чтобы по ним можно было вывести список (историю) ответов на вопросы.

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

  Ответить  
 
 автор: sim5   (11.06.2009 в 14:11)   письмо автору
 
   для: *m*   (11.06.2009 в 13:53)
 

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

  Ответить  
 
 автор: *m*   (11.06.2009 в 14:18)   письмо автору
 
   для: sim5   (11.06.2009 в 14:11)
 

хм и правда, да... вобщем нужно все будет попробовать сделать подругому.

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

  Ответить  
 
 автор: sim5   (11.06.2009 в 14:31)   письмо автору
 
   для: *m*   (11.06.2009 в 14:18)
 

Не скажу. Так как вы думаете не скажу, потому так как вы хотите делать, ну это просто глупо. Для чего тогда служат базы, файлы, сессия? Для красоты? А все расчеты таскать в форме?
База, либо файл или сессия, как раз у вас и должна служить для сбора и хранения всей информации, как чисто информативной, так и расчетной. Только так, и никак иначе! Надо вам вывести сумму чего-то, обратились к своей "базе", посчитали и вывели.

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

  Ответить  
 
 автор: *m*   (11.06.2009 в 15:46)   письмо автору
 
   для: sim5   (11.06.2009 в 14:31)
 

кстати вопрос, а почему плохо держать в форме расчеты??

  Ответить  
 
 автор: sim5   (11.06.2009 в 16:14)   письмо автору
 
   для: *m*   (11.06.2009 в 15:46)
 

Потому, что это просто глупо. Забудьте о существовании РНР, давайте вернемся к статисту. У вас занимают деньги, и вы вынуждены вести учет долгов. Как вы это будете делать? На одном листике запишите фимилии должников, а на другом сколько вам каждый должен? Думаю нет. Не удобно будет, так как не связаны между собой эти два списка. Вы уж точно поступите так:
Ианов - 750
Сидоров - 840
Петров - 730

И так ведете дальше свой учет:
Ианов - 750 400
Сидоров - 840 300
Петров - 730 5000 12000 (убью)

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

PS. Вопрос: трудно вам будет по этому списку посчитать сумму всех долгов, взглянув на него? Или для этого обязательно нужно держать все в уме?

  Ответить  
 
 автор: *m*   (11.06.2009 в 17:42)   письмо автору
 
   для: sim5   (11.06.2009 в 16:14)
 

все все убедили окончательно, буду переделывать, опять таки возьму в толк ваши рекомендации насчет продумывания проекта до самых мелочей. в моем настоещем случае вот кстати к чему это и привело, теперь придеться все переделывать.

я кстати разобрался как поместить в сессию и масив и значение, все вобщем проще простого:


<?
$_SESSION
['vop1'] = $vopros1[$value1];

// для второго вопроса $_SESSION['vop2'] =$vopros2['$value2']?>

но вот только вот этот момент мне не понятен, почему, если в конце я вывожу echo ($_SESSION['vop1']); ($_SESSION['vop2']); и т.д. то выводиться только последнее, т.е например из двух ($_SESSION['vop1']); ($_SESSION['vop2']); выведиться только - ($_SESSION['vop2']); ??? ведь сессии на то и сессии, что могут хранить все значения в течении срока своего жизни как я понял..

  Ответить  
 
 автор: sim5   (11.06.2009 в 18:13)   письмо автору
 
   для: *m*   (11.06.2009 в 17:42)
 

А я вас ни в чем и не убеждаю, я говорю об естественных вещах. Все, без исключения, языки программирования, это всего лишь набор инструментов предназначенных для решения на компьютере тех задач, кторые мы ставим. Если вы думаете логично и естественно в решении задач в повседневной жизни, то также вы должны думать и в решении задачи для компьютера. Не язык программирования должен довлеть над вами, а вы должны ставить задачи ему.
Другое дело знание языка, но человек всегда сперва учиться ходить, а потом только бегать, и у вас тоже не получиться обратного. Язык надо изучать. Не трудности многомерного массива вас должны пугать, понять что это такое можно, и изучить работу с ним не так сложно. Но если вы не продумаете свою задачу, то это потребует лишних издержек, и рано или поздно, вам придется все переделывать заново. Вот чего надо боятся. Даже простую задачу нужно обдумать.
Могу сказать, что вы записав значение в сессию, опять таки решили (обдумали) далеко не все. Да и запись:
$_SESSION['vop1'] = $vopros1[$value1];
это не запись массива, а всего лишь одного значения в одну переменную. Массив в сессии это будет:
$_SESSION['questions'] = array($vopros1[$value1], $vopros1[$value2]);
Вот теперь в сессии есть переменная, которая является массивом. Но вам делать нужно совсем не так. Вы пытаетесь решить задачу "в лоб", а это плохо.

Почему у вас выводит последнее, я не знаю, потому как совсем не ведаю, что вы пишите и как, что вы хотите получить и как.

  Ответить  
 
 автор: *m*   (11.06.2009 в 19:13)   письмо автору
 
   для: sim5   (11.06.2009 в 18:13)
 

тоесть получаеться, что значения переменных которые я заношу в сессии, не сохраняются.

если $_SESSION['vop1'] = $vopros1[$value1]; вывести сразу после вопроса

echo ($_SESSION['vop1']); то возвращает, как раз выбранный вариант, а если я в конце скрипта
после всех вопросов вывожу подряд:
<?
echo ($_SESSION['vop1']);
echo (
$_SESSION['vop2']);
echo (
$_SESSION['vop3']);
echo (
$_SESSION['vop4']);
echo (
$_SESSION['vop5']);
?>

то выводиться только ($_SESSION['vop5']);

почему?? ведь значения переменных сессии также как и массивы, должны храниться до окончания сессии, ведь так?

  Ответить  
 
 автор: sim5   (11.06.2009 в 19:26)   письмо автору
 
   для: *m*   (11.06.2009 в 19:13)
 

Не знаю чего вы там там пишите в сессию, и вообще стартуете ли ее, но:
<?
session_start
();
$_SESSION['vop1'] = 1
$_SESSION['vop2'] = 2
$_SESSION['vop3'] = 3
$_SESSION['vop4'] = 4
$_SESSION['vop5'] = 5;

echo 
$_SESSION['vop1'] .", "$_SESSION['vop2'] .", "$_SESSION['vop3'] .", "$_SESSION['vop4'] .", "$_SESSION['vop5'];
?>

будет работать на ура, и хранить эти данные как минимум (по умолчанию) 24 минуты (параметр session.gc_maxlifetime = 1440 в php.ini).

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

  Ответить  
 
 автор: *m*   (11.06.2009 в 20:19)   письмо автору
 
   для: sim5   (11.06.2009 в 19:26)
 

да я уже решил переделывать и буду. просто для меня важно это уже понять почему не сохраняется информация.

я стартую сессию, вобщем делаю все как и в вашем примере, вот код:


<? 
session start
(); 

//форма с 1ым вопросом
//дальше след. код:
$vopros1 = array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант"); 
$value1 = ($_POST['vopros1']);  
$_SESSION['vop1'] = $vopros1['value1']; 

//форма со 2ым вопросом
//дальше опять таки:
$vopros2 = array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант"); 
$value2 = ($_POST['vopros2']);  
$_SESSION['vop2'] = $vopros1['value2']; 

//форма с 3им вопросом
$vopros3 = array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант"); 
$value3 = ($_POST['vopros3']);  
$_SESSION['vop3'] = $vopros1['value3']; 

//форма с 4ым вопросом
$vopros4 = array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант"); 
$value4 = ($_POST['vopros4']);  
$_SESSION['vop4'] = $vopros1['value4']; 

//форма с 5ым вопросом
$vopros5 = array(1=> "1 вариант"2=> "второй вариант"3=> "3 вариант"); 
$value5 = ($_POST['vopros5']);  
$_SESSION['vop5'] = $vopros1['value5']; 

// далее хочу вывести все переменные сессии:
echo ($_SESSION['vop1']);
echo (
$_SESSION['vop2']);
echo (
$_SESSION['vop3']);
echo (
$_SESSION['vop4']);
echo (
$_SESSION['vop5']);
?>

результатом работы этого скрипта будет:
скрипт выводит поочередно echo ($_SESSION['vop1']); после первого вопроса, только echo ($_SESSION['vop2']); после второго вопроса, только echo ($_SESSION['vop3']); после 3его вопроса, а куда деваются echo ($_SESSION['vop1']); и ($_SESSION['vop2']); ??

и соответсвенн после 5го вороса я получаю только echo ($_SESSION['vop5']); а куда деваются все предидущие??

в случае вашего примера:


<?
session_start
(); 
$_SESSION['vop1'] = 1;  
$_SESSION['vop2'] = 2;  
$_SESSION['vop3'] = 3;  
$_SESSION['vop4'] = 4;  
$_SESSION['vop5'] = 5

echo 
$_SESSION['vop1'] .", "$_SESSION['vop2'] .", "$_SESSION['vop3'] .", "$_SESSION['vop4'] .", "$_SESSION['vop5'];
?>

все действительно работает, попробовал вывести методом пристыковки через запятую свои переменные после пяти вопросов, вывелись 4 запятые и ответ на 5 вопрос.

, , , , 3 вариант


вот этот вопрос меня только и мучает, почему, куда деваются предидущие??

  Ответить  
 
 автор: Trianon   (11.06.2009 в 20:27)   письмо автору
 
   для: *m*   (11.06.2009 в 20:19)
 

Включите полную диагностику ошибок - всё станет ясно.

  Ответить  
 
 автор: *m*   (11.06.2009 в 20:36)   письмо автору
 
   для: *m*   (11.06.2009 в 20:19)
 

пардон в вопросах со второго ошибся
вместо
 
$_SESSION['vop2'] = $vopros1['value2']; 

будет соответсвенно
$_SESSION['vop2'] = $vopros2['value2']; 

и для всех соответсвенно vopros3, 4 и 5.

  Ответить  
 
 автор: sim5   (11.06.2009 в 20:39)   письмо автору
 
   для: *m*   (11.06.2009 в 20:19)
 

Потому, что вы присваиваете переменной $value1 значение из формы $_POST['vopros1'] (НЕ ставьте лишних скобок, они тут совсем не нужны, как и не нужны здесь - echo ($_SESSION['vop1'])), а запаписываете в сессию по несуществующему ключу. А должно быть:
$value1 = $_POST['vopros1'];
$_SESSION['vop1'] = $vopros1[$value1];
и т.д..

Немного погодя, напишу Заключение.

  Ответить  
 
 автор: *m*   (11.06.2009 в 20:50)   письмо автору
 
   для: sim5   (11.06.2009 в 20:39)
 

все заработало, спс.

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

спасибо за помощь и участие в разборе, очень сложно самому учиться.

  Ответить  
 
 автор: sim5   (12.06.2009 в 00:20)   письмо автору
 
   для: *m*   (11.06.2009 в 20:50)
 

Заключение (доктора): у пациента несварение желудка, легкий насморк. Способ лечения: мазь "Вишневского" по чайной ложке после еды, компресс на голову в виде учебника РНР.
Это шутка :) А если серьезно. Вы просили пример, даю.

Чтобы понять, как работает механизм сессий, как записать в нее, и считать из нее переменную, совсем не обязательно задумывать проект какой либо, достаточно это изучить на простейших примерах. И так можно изучать все функции, конструкции, выражения языка.
За всю эту долгую дискуссию, я так ни разу и не услышал от вас генерального - что вы пытаетесь сделать и как. Если вы решили изучить некий РНР-механизм (той же сессии), то читайте выше, но коли вы пишите сценарий, то будьте добры думать о логике его работы. Где она у вас?
Конечно, вы можете записывать в базу все, но разве в этом соль? Вы посмотрите, как вы изначально собираете данные - а ведь на протяжении всей беседы не раз звучало слово массив. И где у вас его работа наблюдается? Вы даже не попытались этого сделать.
Надо ведь не просто изучать функции и конструкции языка, а еще уметь применять их с выгодой, понимать, где они могут принести пользу. Это как выучить семь нот, но не понимать, для чего они нужны. Если вы изначально не захотели сделать свою простейшую задачу как логический автомат, то и к базе вы будет обращаться так же, как вы сейчас поступаете с сессией.

Допустим, что я захотел узнать интересы людей: любимая музыка, блюдо, машины, и т.п.. Для простоты, я буду предлагать им по три варианта на каждый вопрос. Естественно, что человеку может нравиться как одно из трех предлагаемых направлений в музыке, так и все три. И так по всем вопросам. И это я держу в уме. Взяв листок с ручкой, я написал вопросы, и варианты ответов на них.
Где и как мы будем хранить количество ответов на варианты? Какие могут быть вопросы – конечно же, напротив вариантов ответов. Уже вырисовывается некая таблица.
Да еще вопросы могут оказаться неактуальными, значит, нужно будет как-то их удалять, или править. Да и хорошо бы иметь возможность добавлять новые.
А как будем задавать вопросы? Если вопросов мало, то можно все напечатать на одном листике. А если много, значит, потребуется несколько листов.
А что нам показывать человеку после его ответов? Будем показывать то, что он отметил и общую статистику интересов, имеющуюся на этот момент. А при выводе информации об интересах, не выводить же нам опять вопрос, значит нужно описание для данного вопроса, которое мы будем показывать человеку при выводе результатов. Значит, в свою таблицу я добавляю еще один столбец, и напротив каждого вопроса пишу описание его.

Но «бумажный» не интересен, поэтому будем «компьютезировать» свою задачу, и выставим ее в интернете. Но как? После долгих расспросов сведущих людей, от слесаря своего ЖЭКа узнал «волшебное» слово – HTML. Почитав об этом чуде, научился писать странички для Интернета, готовить формы…. Но, оказывается HTML не всемогущ. И только сантехник моего ЖЭКа подсказал правильное направление – «Тебе нужно ПиЭйчПи», заливая марочным Портвейном это сладкое слово. Сладким словом оказался PHP, или попросту «пых» - язык программирования серверных приложений.

Как и любой уважающий себя, язык, РНР представился о своих возможностях: какими выражениями может излагаться, чего он понимает, и что может предложить. Узнал от него, что строка это оказывается тип, а типы еще те бывают…. А вот тип массив заинтересовал, уж больно сильно он напоминал таблицу на бумаге с приготовленными вопросами. И оказывается, что у «пыха» столько предложений для того чтобы разбираться с этим типом. Решено, преобразуем свою таблицу в массив. Потренировавшись с массивами, поняв, что к чему, составляем массив для опроса:
<?
$array 
= array(
  array(
"quest" => "Какую музыку вы любите?""like" => "Любимая музыка""var" => array(=> array("Поп",0),array("Рок",0),array("Джаз",0))),
  array(
"quest" => "Ваше любимое блюдо?""like" => "Любимое блюдо""var" => array(=> array("Борщ",0),array("Суп",0),array("Щи",0)))
);
?>

Мы люди сведущие, и знаем, что компьютер все хранит в файлах, и мы свои вопросы будем хранить в них же. А коли РНР «язык», значит, он должен уметь сохранить наши вопросы в файле. И правда, нашли подходящее - file_put_contents(). Но как бы нам сохранить массив так, чтобы это был просто текст, а когда нам нужен он, то опять был массивом. Есть и такое – serialize(). И так, выполнив:
<?
file_put_contents
("questions"serialize($array));
?>

мы приготовили файл с вопросами, и заодно создали архив для хранения накапливаемой информации. Ну а, далее руководствуясь тем, что мы хотим сделать, выбираем то, что нам предлагает РНР.
<?
//стартуем/продолжаем сессию
session_start();
//если файл с вопросами еще не загружался в наш сценарий,
//загружаем его, преобразуя опять в массив
//загружать файл будем в сессию, 
//используя ее как временное хранилище наших данных
if(!$_SESSION['questions']) $_SESSION['questions'] = unserialize(file_get_contents("questions"));
//мы бы не стали показывать все листики с вопросами,
//а показывали по одному, столько раз, сколько листиков имеем,
//поэтому и на компьютере мы будем показывать по одному вопросу,
//и столько раз, сколько у нас вопросов (элементов в массиве)
$n count($_SESSION['questions']); //число вопросов в опросе
//а это счетчик показов вопросов, и чтобы он не перзаписывался
//при каждом обращении к странице, храним его в сессии
if(!isset($_SESSION['forms'])) $_SESSION['forms'] = $n+1;
//проверяем – пришла ли форма с выбором от пользователя
if($_POST['send']) {
  
$k $n $_SESSION['forms']; //получаем текущий вопрос (индекс массива)
  //полученный массив значений формы обходим в цикле
  //суммируя ячейки вариантов ответа (индекс 1), ключа «var»,
  //индекс которых совпадает со значением принятым от формы,
  //так мы будем накапливать статистику по вопросу,
  //сохраняя ее, в последствии, в файл    
  
foreach($_POST['q'] as $val$_SESSION['questions'][$k]['var'][$val][1]++;
  
//для каждого опрашиваемого, информация о его выборе важна только ему,
  //а значит это временная информация, и мы ее будем хранить в другом массиве,
  //не сохраняя в общей статистике,
  //а так, как мы определим (потом) наши элементы в форме как массив,
  //то $_SESSION['vars'] будет хранить в себе массив выбора,
  //а индекс $k будет определять, для какого он вопроса  
  
$_SESSION['vars'][$k] = $_POST['q'];
}
//инкрементируем счетчик вывода вопросов 
$_SESSION['forms']--;
//если еще есть вопросы, выводим их
if($_SESSION['forms']) {
  
//получаем текущий элемент массива вопросов 
  
$el $_SESSION['questions'][$n $_SESSION['forms']];
  
//выводим вопрос и форму
  
echo "<p>" $el['quest'] . "</p><form action=\"interrogation.php\" method=\"post\">";
  
//мы держали в уме, что варианты, это не выбор одного из трех,
  //поэтому выводим чекбоксы в форму как массив элементов,
  //значениям которых будем указывать индексы массивов ключа var   
  
foreach($el['var'] as $key => $val) echo $key ". " $val[0] . "<input type=\"checkbox\" name=\"q[]\" value=\"" .$key"\"><br>";
  echo 
"<br><input type=\"submit\" name=\"send\" value=\"Отправить\"></form>";
} else {
  
//если на все вопросы получены ответы, 
  //сохраняем результат в файл
  
file_put_contents("questions"serialize($_SESSION['questions']));  
  
//и выводим информацию о сделанном выборе,
  //используя временный массив $_SESSION['vars']
  //как ключи доступа к массиву вопросов  
  
echo "<p><b>Ваши предпочтения</b></p>";
  foreach(
$_SESSION['vars'] as $key => $var) {
    
//выводим описание вопроса
    
echo "<p>" $_SESSION['questions'][$key]['like'] . ":<br>";
       
//выводим выбранные опрашиваемым варианты
       
foreach($var as $val) echo "&nbsp;&nbsp;" $_SESSION['questions'][$key]['var'][$val][0] . "<br>";
  }
  
//показываем общую (накопленную) статистику
  
echo "<p><b>Общая статистика</b></p>";
  foreach(
$_SESSION['questions'] as $var) {
    
//выводим описание вопроса
    
echo "<p>" $var['like'] . ":<br>";
      
//выводим накопленную статистику по вопросу
      
foreach($var['var'] as $val) echo "&nbsp;&nbsp;" $val[0] . " - " $val[1] . "<br>";
  }
  
//завершаем работу сценария
  
exit;

?>

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

  Ответить  
 
 автор: *m*   (12.06.2009 в 15:06)   письмо автору
 
   для: sim5   (12.06.2009 в 00:20)
 

а вы случайно не автор книг?))
очень крутой пример, + пояснения, спасибо что тратите свое время на такие подробные описания. ваш пример мне очень пригодиться, я по нему буду учиться понимать, насколько все можно сделать проще и правельнее. на самом деле опыт, которой мы получаем бесценен, его не купить за деньги, и те советы и решения, которые вы подсказываете на этом форуме, я думаю многим помогают. респект вам!) куда выслать пиво?))))

  Ответить  
 
 автор: sim5   (12.06.2009 в 15:22)   письмо автору
 
   для: *m*   (12.06.2009 в 15:06)
 

Я автор комментариев на этой странице. Пиво, ныне продаваемое не пью - это не пиво ;-)

  Ответить  
 
 автор: Trianon   (12.06.2009 в 15:48)   письмо автору
 
   для: sim5   (12.06.2009 в 15:22)
 

Ну нельзя же так...
Что будет происходить со счетчиками при одновременной работе со скриптом нескольких пользователей? Я даже не про файловые блокировки, фиг с ними, пусть даже file_get_contents и file_put_contents считаются атомарными...

  Ответить  
 
 автор: sim5   (12.06.2009 в 15:55)   письмо автору
 
   для: Trianon   (12.06.2009 в 15:48)
 

Ничего не будет происходить, ибо чтобы все было, значит надо все еще "отшлифовать", а все писать просто сил нет )

  Ответить  
 
 автор: Trianon   (12.06.2009 в 16:04)   письмо автору
 
   для: sim5   (12.06.2009 в 15:55)
 

Ничего хорошего с ними не будет происходить.
Каждый в свой сессионный файл получит по копии этого массива и начнет с этой копией работать.
У каждого будет свой собственный набор счетчиков.
В конце прочесса опроса копии начнут скидываться в общий файл, каждый раз перекрывая предыдущее содержимое заново.
В итоге учтены окажутся предпочтения последнего заканчивающего опрос. Но никак не всех остальных, кто проходил его в это же время.

И дело тут не в шлифовке. А в нарушении базового принципа. В сессии нельзя держать общие данные - т.е. имеющие отношение к кому-либо, кроме клиента этой сессии.

  Ответить  
 
 автор: sim5   (12.06.2009 в 16:29)   письмо автору
 
   для: Trianon   (12.06.2009 в 16:04)
 

Если говорить о практическом применении, а не как пример, то для статистики самый правильный выбор это база данных. Проблема у автора темы в том, что он не может представить свой набор данных в виде массива, таблицы, хотя они явно табличную структуру имеют.
А ведь он решил использвовать в конечном итоге базу! Могу себе представить, какую струкутуру она будет иметь, если не представлять себе, казалось бы, естественное. Ну не вам рассказывать, что в этом случае получится, да и получится ли вообще.
Работа с базой так или иначе тесно связана с массивом. Вот пусть и учится товарищ, а вопросы совместного доступа и многое другое, что ему еще придется изучить, это уже другая тема, о которой придется еще не одну страницу в разделе написать.

  Ответить  
 
 автор: Valick   (12.06.2009 в 16:13)   письмо автору
 
   для: sim5   (12.06.2009 в 15:22)
 

Попробуйте "Нижегородское бочковое" мне понравилось)

  Ответить  
 
 автор: sim5   (12.06.2009 в 16:30)   письмо автору
 
   для: Valick   (12.06.2009 в 16:13)
 

Хеопс пришлет, если, попробую :)

  Ответить  
 
 автор: ols   (10.06.2009 в 10:46)   письмо автору
 
   для: *m*   (09.06.2009 в 23:06)
 

Вы приведите более полный код

  Ответить  
 
 автор: ols   (10.06.2009 в 09:21)   письмо автору
 
   для: *m*   (09.06.2009 в 20:40)
 

Для этого есть is_array()

  Ответить  
 
 автор: sim5   (10.06.2009 в 09:26)   письмо автору
 
   для: ols   (10.06.2009 в 09:21)
 

И что? Если говорить просто о типе, то да, если говорить о заполняемости, то:
<?
$a 
= array();
if (
is_array($a)) echo "Yes";

Чем именно обусловлена (оправдана) в данном случае проверка типа?

  Ответить  
 
 автор: ols   (10.06.2009 в 10:45)   письмо автору
 
   для: sim5   (10.06.2009 в 09:26)
 

Посмотрел мануал и тут же понял что не прав, да и с первого поста не совсем понял суть того что хочет автор.

  Ответить  
Rambler's Top100
вверх

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