Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356

Как это работает эта конструкция?

30.01.2016, 00:19. Показов 906. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
$res = mysql_query($query) or die(mysql_error());
$arr = array();
while($row = mysql_fetch_assoc($res)) {
if ( ! isset($arr[ $row['q_id']  ])) $arr[ $row['q_id'] ] []= array();
$arr[ $row['q_id'] ][] = $row;
}
echo '<pre>'; print_r($arr); echo '</pre>';
собственно объясните в чем соль.

на экран выводит это

HTML5
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
Array
(
    [3] => Array
        (
            [0] => Array
                (
                )
 
            [1] => Array
                (
                    [q_id] => 3
                    [q_quest] => Сколько будет 5+2?
                    [a_id] => 32
                    [a_answer] => Семь
                    [a_correct] => 1
                )
 
            [2] => Array
                (
                    [q_id] => 3
                    [q_quest] => Сколько будет 5+2?
                    [a_id] => 13
                    [a_answer] => Тринадцать
                    [a_correct] => 0
                )
 
            [3] => Array
                (
                    [q_id] => 3
                    [q_quest] => Сколько будет 5+2?
                    [a_id] => 12
                    [a_answer] => Шесть
                    [a_correct] => 0
                )
 
            [4] => Array
                (
                    [q_id] => 3
                    [q_quest] => Сколько будет 5+2?
                    [a_id] => 11
                    [a_answer] => Пять
                    [a_correct] => 0
                )
 
        )
 
    [4] => Array
        (
            [0] => Array
                (
                )
 
            [1] => Array
                (
                    [q_id] => 4
                    [q_quest] => Сколько будет 10-3?
                    [a_id] => 31
                    [a_answer] => Семь
                    [a_correct] => 1
                )
 
            [2] => Array
                (
                    [q_id] => 4
                    [q_quest] => Сколько будет 10-3?
                    [a_id] => 15
                    [a_answer] => Три
                    [a_correct] => 0
                )
 
            [3] => Array
                (
                    [q_id] => 4
                    [q_quest] => Сколько будет 10-3?
                    [a_id] => 16
                    [a_answer] => Десять
                    [a_correct] => 0
                )
 
            [4] => Array
                (
                    [q_id] => 4
                    [q_quest] => Сколько будет 10-3?
                    [a_id] => 17
                    [a_answer] => Пять
                    [a_correct] => 0
                )
 
        )
 
    [5] => Array
        (
            [0] => Array
                (
                )
 
            [1] => Array
                (
                    [q_id] => 5
                    [q_quest] => Сколько будет 10-8?
                    [a_id] => 26
                    [a_answer] => Два
                    [a_correct] => 1
                )
 
            [2] => Array
                (
                    [q_id] => 5
                    [q_quest] => Сколько будет 10-8?
                    [a_id] => 25
                    [a_answer] => Двести 
                    [a_correct] => 0
                )
 
            [3] => Array
                (
                    [q_id] => 5
                    [q_quest] => Сколько будет 10-8?
                    [a_id] => 23
                    [a_answer] => Один
                    [a_correct] => 0
                )
 
            [4] => Array
                (
                    [q_id] => 5
                    [q_quest] => Сколько будет 10-8?
                    [a_id] => 19
                    [a_answer] => Четыре
                    [a_correct] => 0
                )
 
        )
 
)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2016, 00:19
Ответы с готовыми решениями:

Что делает эта конструкция -> ?
Простите за глупый вопрос, но меня интересует что делает конструкция -&gt; в php скрипте, например $data-&gt;set_info('author', $_post); ...

Как работает следующая конструкция?
&lt;a onclick=&quot;$('#backup').submit();&quot; class=&quot;button&quot;&gt;&lt;?php echo $button_backup; ?&gt;&lt;/a&gt;Не могу разобраться в работе этого кода. Мне...

Что это за конструкция, подскажите
$mdn_data = ( !empty($mdn_data) &amp;&amp; $mdn_data != &quot;false&quot; ); Я не понимаю что это значит, вроде это не тернарный оператор, и не...

15
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 00:21  [ТС]


А нужно вот так вот что бы нумеровалось не могу добиться такого результата.
по порядку
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
30.01.2016, 00:30
Цитата Сообщение от maruo Посмотреть сообщение
собственно объясните в чем соль.
на экран выводит это
Не знаю, что тут объяснять... почитайте про массивы и циклы.

Цитата Сообщение от maruo Посмотреть сообщение
А нужно вот так вот что бы нумеровалось не могу добиться такого результата.
Вы подставляете туда $row['q_id'] из БД. Какое значение есть, такое и подставляется.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 00:50  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
Вы подставляете туда $row['q_id'] из БД. Какое значение есть, такое и подставляется.
Пустую [] я не могу подставить ибо ошибку выдает

Добавлено через 17 минут
вообще проблема в том что я не пойму как это работает точнее даже прочитать не могу вот эту строку

PHP
1
if ( ! isset($arr[ $row['q_id']  ])) $arr[ $row['q_id'] ]= array();
тоесть если не существует $arr[ $row['q_id'] ])) а далее все , впервые вижу такой код и даже в замешательстве,
Если бы объяснили что происходит дальше мб я бы вник в суть
0
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
30.01.2016, 01:05
Сразу после второй строки пропишите:
PHP
1
$arr = array_values($arr);
По идее должно помочь.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 01:17  [ТС]
Пифагор, нет не помогло.

каким еще способом можно перебрать так запрос?

или мб можно что то сделать с запросом?

Кликните здесь для просмотра всего текста
SQL
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
$query = "(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qquery_1  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qquery_1 ORDER BY RAND() LIMIT 3)
 
                    UNION
 
                (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qquery_2  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qquery_2 ORDER BY RAND() LIMIT 3)
 
                    UNION
                    
                (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qquery_3  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qquery_3 ORDER BY RAND() LIMIT 3)
        
                        ";
0
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
30.01.2016, 01:23
вот.
больше идей нет

Добавлено через 3 минуты
Цитата Сообщение от maruo Посмотреть сообщение
или мб можно что то сделать с запросом?
я не знаю. надо на структуру базы смотреть или, хотя бы, на текущую таблицу.
Я вообще, смутно представляю, из-за чего такое может быть.
У меня такого не было ни разу. ключи никогда не начинались со значения, отличного от нулевого...

Добавлено через 1 минуту
Но да, дело в запросе. точнее, в значениях столбцов или полей.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 01:26  [ТС]
Пифагор, Я попробую объяснить сейчас чего я добиться хочу, а вы уже ответите сможете намекнуть в какую сторону мне править.

таблицы

Кликните здесь для просмотра всего текста

Кликните здесь для просмотра всего текста

Допустим выберем 1 вопрос из бд с 4 мя вопросами

в первом запросе я выбираю вариант ответа который верный.
во втором 3 неверных варианта ответа.(в базе много неверных ответов, они не ограничены

SQL
1
2
3
4
5
6
7
    $query = "(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qquery_1  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qquery_1 ORDER BY RAND() LIMIT 3)";
Но дергать каждый раз БД после ответа пользователя , выводить новый вопрос не хочу.(слишком долго работает, пользователь ответит проверится ответ, пока новый запрос произойдет займет время , в сессии гораздо быстрее вывести)

Надо выбрать нужное кол-во вопросов с ответами и поместить их в сесии.
0
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
30.01.2016, 01:32
Понятно. Делаете проверку типа капчи.
Но это все равно не объясняет, почему ключи начинаются с [3]))
А, с другой стороны, какая разница, какие значения у ключа. Оно же все равно если будет вызываться, то не статически. верно?
это как DHCP. что выдал - с тем и работай...
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 01:36  [ТС]
Пифагор, в принципе вы правы, какой ключ будет не особо будет важно, почему с 3х начинается выше человек сказал, т.к подставляется поле из БД q_id (q_id это номер вопроса в БД)

А как еще можно вывести несколько вопросов из БД с ответами. Просто сейчас у меня получается число вопросов строго ограничено.

У меня же перед тем как вывести сами варианты ответов, случайно выбираются несколько id вопросов

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$difficulty = 1;
 
$query = mysql_query("SELECT q_id FROM question 
                                    WHERE difficulty=$difficulty
                                    ORDER BY RAND() LIMIT 3");
 
 
 
while($qrand22 = mysql_fetch_assoc($query))
            $data[]= $qrand22['q_id'];
        (int)$qquery_1 = $data['0'];
        (int)$qquery_2 = $data['1'];
        (int)$qquery_3 = $data['2'];
А на их основе уже варианты ответов подъезжают
0
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
30.01.2016, 01:48
Не знаю. Может, $arr берет за начальный ключ следующий ключ массива $data['2'];???
Сложно так сказать. Надо изначально в коде рыцо. Но сейчас я уже не уверен, что дело в базе.
С какой радости запрос подставляет первичный ключ со значением 3???

Добавлено через 58 секунд
нет, это нет ключи, это значения... тогда вообще не знаю. извиняйте...
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 01:54  [ТС]
Пифагор, Да ладно я попробую разобраться
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
30.01.2016, 10:44
Цитата Сообщение от maruo Посмотреть сообщение
тоесть если не существует $arr[ $row['q_id'] ])) а далее все , впервые вижу такой код и даже в замешательстве,
Если бы объяснили что происходит дальше мб я бы вник в суть
Если нормально код отформатировать, может станет ясней:
PHP
1
2
3
4
5
6
7
while($row = mysql_fetch_assoc($res))
{
    if(!isset($arr[$row['q_id']])) // Если элемента не существует
        $arr[$row['q_id']][]= array(); // Добавляем в него пустой массив
    
    $arr[$row['q_id']][] = $row; // И в любом случае добавляем данные
}
На самом деле эта конструкция просто прибавляет пустой массив. Посмотрите на структуру массива, которую вы кидали в 1-ом сообщении. Там [3][0] и [4][0] - пустые. Эту пустоту как раз и делает !isset.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 15:35  [ТС]
Цитата Сообщение от Jodah Посмотреть сообщение
На самом деле эта конструкция просто прибавляет пустой массив. Посмотрите на структуру массива, которую вы кидали в 1-ом сообщении. Там [3][0] и [4][0] - пустые. Эту пустоту как раз и делает !isset.
Просто я в первые вижу такую реализацию.

я думал должно было быть так
PHP
1
2
3
4
5
6
7
8
while($row = mysql_fetch_assoc($res))
{
    if(!isset($arr[$row['q_id']])){ // Если элемента не существует
        $arr[$row['q_id']][]= array(); // Добавляем в него пустой массив
    
    $arr[$row['q_id']][] = $row; // И в любом случае добавляем данные
     }
}
Как бы с фигурными скобками
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
30.01.2016, 15:51
maruo, ну как должно быть - зависит от задачи, сам код работоспособен и не должен вызывать ошибки.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
30.01.2016, 15:54  [ТС]
Jodah, никто не спорит, работает.
Просто для меня эти циклы сложно даются, сколько я не пытаюсь с ними биться, сложно мне с ними .
Более простые еще нормально.
А вот такой цикл как сейчас с 3м уровнем вложенности массивов, сложно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2016, 15:54
Помогаю со студенческими работами здесь

Не работает конструкция if...else
Доброго времени суток. Входной файл: 12 This is a sample text! Код программы: &lt;?php $inpf = fopen(&quot;input.txt&quot;,...

Почему работает следующая конструкция
Добрый день Почему работает следующая конструкция: &lt;?php $t=1; if($t==1){?&gt; &lt;div&gt;t=1 Выводится первый div&lt;/div&gt; &lt;?php...

Не правильно работает конструкция if else ,не ясно почему
В этом коде: if (($login==$result) &amp;&amp; ($password==$result)) { switch ($result) { ...

Как это работает
Можно сказать в каждом 3 коде вижу такую конструкцию public function doExecute( ipsRegistry $registry ) Скажите пожалуйста. ...

/menu/ как это работает?
вот смотрю коды и встречаю там такое &lt;a href=&quot;/menu/&quot;&gt;меню&lt;/a&gt; куда оно ссылается ? какими методами воспроизводится? и как при...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru