Предположим, у вас есть HTML-форма с небольшим количеством бэкэнда php. Форма имеет только одно поле, которое возвращает 1 или 0. Например …
И скрипт php записывает это в базу данных MySQL вместе с информацией об операционной системе пользователя.
Таким образом, вы можете обнаружить, что многие пользователи Windows8 любят вафли, но не так много пользователей Linux Mint.
«О … 87% пользователей Windows 8 сказали» да «… это то, что я думаю».
Но классы (а именно, в данном случае тип ОС) не действительно заранее известен разработчиком. Таким образом, фактическая таблица MySql представляет собой беспорядочную конгломерацию ответов (да или нет) вместе с типом ОС; возможно связанный с первичным ключом, который является автоинкрементным целым числом. Для облегчения жизни есть отдельный атрибут для «да» и «нет», так что каждый раз, когда пользователь говорит «да», записывается отдельно от того, когда он говорит «нет». Данные могут выглядеть примерно так:
ID | OS_type | ДА | НЕТ
и так далее
Таким образом, проблема возникает при попытке автоматически получить какую-то связную деталь из этого набора данных. Вы не можете просто создать ассоциативный массив, основанный на паре ключ-значение OS-ответа, потому что существует много дублирующихся ключей ОС. Действительно, должен быть создан ассоциативный массив уникальных ключей, который не потеряет критические данные: при его создании счетчик числа «да» и «нет» будет присоединен как значения к соответствующим ключам. Как можно создать такой ассоциированный массив?
Предполагая, что вы извлекаете весь набор данных из MySQL (то есть «SELCET * FROM waffles» в массив $ waffleResponse)
$resultSet = array();
foreach($waffleResponse as $r)
{
if (!array_key_exists($r['OS_type'], $resultSet))
{
$resultSet[$r['OS_type']] = array(
'YES'=>0,
'NO'=>0
);
}
$resultSet[$r['OS_type']]['YES'] += $r['YES'];
$resultSet[$r['OS_type']]['NO'] += $r['NO'];
}
var_dump($resultSet);
Будет вывод:
array(5) {
["Windows 7"]=>
array(2) {
["YES"]=>
int(1)
["NO"]=>
int(2)
}
["Windows 8"]=>
array(2) {
["YES"]=>
int(0)
["NO"]=>
int(2)
}
["Jellybean"]=>
array(2) {
["YES"]=>
int(2)
["NO"]=>
int(0)
}
["Ubunto"]=>
array(2) {
["YES"]=>
int(1)
["NO"]=>
int(0)
}
["Iphone 4"]=>
array(2) {
["YES"]=>
int(1)
["NO"]=>
int(0)
}
}
Давайте добавим все ключи ОС из вашего результирующего набора в качестве ключа, а затем добавим все строки в качестве нового подмассива к этому ключу:
$results = array();
while ($row = mysqli_fetch_assoc($res) ) {
if (!array_key_exists('OS_type', $row)) {
//Creating an array key for the os type with an empty array
$results[$row['OS_type']] = array();
}
$results[$row['OS_type']][] = array(
'id' => $row['id'],
'yes' => $row['YES'],
'no' => $row['NO']
);
}