Как создать ассоциативный массив php из грязных данных

Предположим, у вас есть HTML-форма с небольшим количеством бэкэнда php. Форма имеет только одно поле, которое возвращает 1 или 0. Например …

введите описание изображения здесь

И скрипт php записывает это в базу данных MySQL вместе с информацией об операционной системе пользователя.

Таким образом, вы можете обнаружить, что многие пользователи Windows8 любят вафли, но не так много пользователей Linux Mint.

«О … 87% пользователей Windows 8 сказали» да «… это то, что я думаю».

Но классы (а именно, в данном случае тип ОС) не действительно заранее известен разработчиком. Таким образом, фактическая таблица MySql представляет собой беспорядочную конгломерацию ответов (да или нет) вместе с типом ОС; возможно связанный с первичным ключом, который является автоинкрементным целым числом. Для облегчения жизни есть отдельный атрибут для «да» и «нет», так что каждый раз, когда пользователь говорит «да», записывается отдельно от того, когда он говорит «нет». Данные могут выглядеть примерно так:

ID | OS_type | ДА | НЕТ

  1. Windows 7 | 1 | НОЛЬ.
  2. Windows 8 | NULL | 1
  3. Windows 7 | NULL | 1
  4. Желе | 1 | НОЛЬ
  5. Windows 8 | NULL | 1
  6. Убунто | 1 | НОЛЬ
  7. Iphone 4 | 1 | НОЛЬ
  8. Windows 7 | NULL | 1
  9. Желе | 1 | НОЛЬ

и так далее

Таким образом, проблема возникает при попытке автоматически получить какую-то связную деталь из этого набора данных. Вы не можете просто создать ассоциативный массив, основанный на паре ключ-значение OS-ответа, потому что существует много дублирующихся ключей ОС. Действительно, должен быть создан ассоциативный массив уникальных ключей, который не потеряет критические данные: при его создании счетчик числа «да» и «нет» будет присоединен как значения к соответствующим ключам. Как можно создать такой ассоциированный массив?

0

Решение

Предполагая, что вы извлекаете весь набор данных из 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)
}
}
1

Другие решения

Давайте добавим все ключи ОС из вашего результирующего набора в качестве ключа, а затем добавим все строки в качестве нового подмассива к этому ключу:

$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']
);
}
1