Сокрытие повторяющихся данных при постороении

 
0
 
PHP
ava
Jops | 26.03.2013, 13:39
Здравствуйте уважаемые!
Моя проблема проста, но тупиковая. А может и наоборот.
Значит, есть данные из БД. На их основе формируется элементарная таблица (первая таблица на рисунке во вложении). Соответственно надо сделать так, что бы она отображалась, как вторая таблица на рисунке во вложении. То есть после вывода значений первого и второго столбца в строке, не выводить их клоны в нижележащих строках (нужно учесть, что цифры первого столбца могут повторяться, где либо ниже, ну а второй столбец уникален, с ним проблем нет).
Думал в форум по JS обратиться, но может, есть способ именно в php при работе с массивами реализовать это.

Это непосредственно код формирования ячеек в таблице (на лишнее не обращайте внимание, там распарсивается XML и другие, не касающиеся проблемы нюансы):


while ($data = pg_fetch_array($res)) {
            //$filename = "/record/{$data['path']}-in-city-{$data['caller']}.mp3";
            if (in_array($data['call_type'], array(1, 2))) {
                $xml = simplexml_load_string($data['comm']);
                $data['comm'] = array();
                foreach ($xml->phrase as $phrase) {

                    if (!empty($phrase->comm)) {
                        $data['comm'][] = sprintf('<span title="%s" class="t-line">%s</span>', $phrase->comm, $phrase->title);
                    } else {
                        $data['comm'][] = $phrase->title;
                    }
                }
                $data['comm'] = implode(', ', $data['comm']);
            }
            
            echo "<tr>
                <td>{$data['count']}</td>
                <td>" . sprintf($links[$data['call_type']]['user'], $data['user_id'], $data['user_name']) . "</td>
                <td>{$data['agent_num']}</td>
                <td>{$data['call_time']}</td>
                <td>{$data['user_num']}</td>
                <td>{$data['comm']}</td>
                <td>" . (($data['dem_id'] > 0) ? sprintf($links[$data['call_type']]['demand'], $data['dem_id'], $data['dem_id']) : '') . "</td>
                <td id=\"{$data['id']}\" class=\"player\">
                    <a href=\"javascript:void(0)\" onclick=\"showAudioPlayer({$data['id']}, '$filename', '{$data['caller']}')\">Показать плеер</a>
                    <div id=\"player{$data['id']}\"/>
                </td>
            </tr>";
    }


И если интересно, то сама функция:


function rep_incoming_calls_period_list($db) {
        echo "<script src=\"/scripts/audio-player.js\" type=\"text/javascript\"></script>
        <script type=\"text/javascript\">
            AudioPlayer.setup(\"/flash/audioplayer.swf\", {
                width: 290,
                autostart: \"yes\",
                animation: \"no\"
            });
        </script>";

        $sid = $_GET['id'];
        $start = isset($_GET['start']) ? $_GET['start'] : date("Y-m-d");
        $end = isset($_GET['end']) ? $_GET['end'] : date("Y-m-d");
        echo "<form method='get' action=''>
        <input type='hidden' name='action' value='{$_GET['action']}' />
        <input type='hidden' name='type' value='{$_GET['type']}' />
        <table>
            <tr>
                <td>Начало периода</td>
                <td>Конец периода</td>
                <td></td>
            </tr>
            <tr>
                <td>
                    <input type='text' id='data_start' name='start' value='$start' readonly='readonly' size='10' />
                    <input type='button' value='...' id='trigger_start' />
                </td>
                <td>
                    <input type='text' id='data_end' name='end' value='$end' readonly='readonly' size='10' />
                    <input type='button' value='...' id='trigger_end' />
                </td>
                <td><input type='submit' value='Показать' /></td>
            </tr>
        </table>
        </form>
        <table class='t-list awidth'>
            <tr>
                <th><div>Количество звонков</div></th>
                <th><div>ФИО</div></th>
                <th><div>Вн. номер</div></th>
                <th><div>Время</div></th>
                <th><div>Номер</div></th>
                <th><div>Причина</div></th>
                <th><div>Оформил</div></th>
                <th><div></div></th>
            </tr>";
        create_calendar();
        $sql = "SELECT
    c.id as cid, coalesce(dt.cnt,0) AS count,
    CASE WHEN call_type = 1 THEN u.full_name WHEN call_type = 2 THEN c.full_name WHEN call_type = 3 THEN e.full_name ELSE '' END as user_name,
    c.agent_num, to_char(c.call_time, 'YYYY-MM-DD HH24:MI:SS') as call_time,
    CASE WHEN call_type = 1 THEN u.id WHEN call_type = 3 THEN e.id ELSE 0 END as user_id,
    c.user_num, c.call_type,
    CASE WHEN call_type IN (1, 2) THEN p.phrases ELSE c.comm END as comm,
    CASE WHEN call_type IN (1, 2) THEN dem_id ELSE 0 END as dem_id, l.id, l.caller, to_char(l.datestart, 'YYYY/MM/DD/YYYYMMDD-HH24MISS') as path
    FROM calls.incoming_calls as c
    INNER JOIN users as u ON u.id = c.user_uid
    LEFT JOIN (SELECT c.id, count(*) over (partition by c.user_uid) as cnt
    FROM calls.incoming_calls as c WHERE call_time<='$end 23:59:59' AND call_time>='$start 00:00:00') AS dt ON dt.id = c.id
    LEFT JOIN staff.employees as e ON e.id = c.user_uid
    LEFT JOIN ivr.logcalls l ON c.call_parentid=l.id
    LEFT JOIN (
        SELECT c.id, xmlforest(xmlagg(xmlforest(xmlforest(phrase as title, CASE WHEN p.textarea THEN comm ELSE '' END as comm) as phrase)) as phrases)::character varying as phrases
        FROM (SELECT id, unnest(phrases[1:array_upper(phrases, 1)][1:1])::integer as phrase_id, unnest(phrases[1:array_upper(phrases, 1)][2:2]) as comm
        FROM calls.incoming_calls as c) as c
        INNER JOIN account.phrases as p ON p.id = c.phrase_id
        GROUP BY 1) as p ON p.id = c.id
    WHERE dt.cnt >= 5 AND call_time<='$end 23:59:59' AND call_time>='$start 00:00:00'
    ORDER BY 6, 5 DESC;";
        $res = @pg_query($db, $sql) or die_query("Что-то пошло не так", $sql);
        $links = array(
            1 => array(
                'user' => '<a target="_blank" href="?action=view_uc&id=%1$d">%2$s</a>',
                'demand' => '<a target="_blank" href="?action=edit_dem&id=%1$d">%2$d</a>',
            ),
            2 => array(
                'user' => '%2$s',
                'demand' => '<a target="_blank" href="?action=online&id=%1$d">%2$d</a>',
            ),
            3 => array(
                'user' => '<a target="_blank" href="?action=emp_edit&id=%1$d">%2$s</a>',
                'demand' => '',
            ),
            4 => array(
                'user' => '',
                'demand' => '',
            ),
        );
        
            while ($data = pg_fetch_array($res)) {
            //$filename = "/record/{$data['path']}-in-city-{$data['caller']}.mp3";
            if (in_array($data['call_type'], array(1, 2))) {
                $xml = simplexml_load_string($data['comm']);
                $data['comm'] = array();
                foreach ($xml->phrase as $phrase) {

                    if (!empty($phrase->comm)) {
                        $data['comm'][] = sprintf('<span title="%s" class="t-line">%s</span>', $phrase->comm, $phrase->title);
                    } else {
                        $data['comm'][] = $phrase->title;
                    }
                }
                $data['comm'] = implode(', ', $data['comm']);
            }
            
            echo "<tr>
                <td>{$data['count']}</td>
                <td>" . sprintf($links[$data['call_type']]['user'], $data['user_id'], $data['user_name']) . "</td>
                <td>{$data['agent_num']}</td>
                <td>{$data['call_time']}</td>
                <td>{$data['user_num']}</td>
                <td>{$data['comm']}</td>
                <td>" . (($data['dem_id'] > 0) ? sprintf($links[$data['call_type']]['demand'], $data['dem_id'], $data['dem_id']) : '') . "</td>
                <td id=\"{$data['id']}\" class=\"player\">
                    <a href=\"javascript:void(0)\" onclick=\"showAudioPlayer({$data['id']}, '$filename', '{$data['caller']}')\">Показать плеер</a>
                    <div id=\"player{$data['id']}\"/>
                </td>
            </tr>";
    }
    ?>
        </table>
      
    <script type="text/javascript">
        $(document).ready(function() {
            $('.t-list span[title]').tooltip();
            $(".t-list tr").mouseover(function(){
                $(this).addClass("over");
            });
            $(".t-list tr").mouseout(function(){
                $(this).removeClass("over");
            });
        });
    </script>
    <?
}


Comments (2)
ava
Арантир | 26.03.2013, 14:36 #
Сделайте временную переменную, содержащую значение колонки прошлой строки. Вставляйте в текущей строке значение только при условии, что оно отличается от предыдущего.
ava
Jops | 26.03.2013, 15:27 #
Спасибо! Попробую!
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit