Хитрые ассоциативные массивы в CodeIgniter - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь сделать гистограмму для мобильных устройств, которые отправляют данные.Каждую минуту каждое мобильное устройство отправляет пакет данных на веб-сервер, где он затем сохраняется в базе данных MySQL.Каждому мобильному устройству назначаются IP-адреса, и каждый IP-адрес может отправлять данные несколько раз в минуту (иногда до 10).Вот как будет выглядеть пример таблицы:

date_received | bytes | IP address
----------------------------------
1314831600    | 100   | 1482747555
1314831600    | 990   | 1482747555
1314831600    | 074   | 1482747555
1314831660    | 420   | 1482747555
1314831660    | 183   | 1482747555

Итак, вы можете видеть, что один IP-адрес может отправляться несколько раз в минуту в течение нескольких часов (следовательно, нескольких минут).Как бы я создал ассоциативный массив, который выглядел бы так:

array
(
   1314831600 = array
                (
                   1482747555 => 100,
                   1482747555 => 990,
                   1482747555 => 074
                );
   1314831660 = array
                (
                   1482747555 => 420,
                   1482747555 => 183
                );
);

Первым ключом будет значение date_received и IP-адреса, которые отправляются за это время (с соответствующими значениями в байтах).Я использую CodeIgniter и думал о заполнении массивов в цикле базы данных foreach, но не был уверен, как лучше это сделать.У кого-нибудь есть совет?

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

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Вы не можете совместно использовать такие ключи массива (IP-адрес), поскольку они будут перезаписаны.Вы можете сделать что-то вроде:

$packets = array();
while ($row = mysql_fetch_assoc($res)) {
    $packets[$row['date_received']][] = 
        array('ip_address'=>$row['ip_address'], 
        'bytes'=>$row['bytes']
    );
}

Затем вы можете просмотреть данные с помощью:

foreach ($packets as $date => $info) {
    echo "date = $date, ip = $info[ip_address], bytes = $info[bytes]";
}
0 голосов
/ 30 сентября 2011

Если вы переписываете часть вашего массива следующим образом, проблема становится намного проще:

        array
            (
               1482747555 => array(100,990,074)
            );
...