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

0

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

Изображение 174551

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

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

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

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

ID | OS_type | ДА | НЕТ

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

и так далее

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

Теги:
data-processing
associative-array

2 ответа

1
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню