Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2017, 12:45   #1
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Восклицание PHP. Алгоритм группировки

Этот алгоритм используется во всех отчетных системах, и превращает такую плоскую таблицу в структуру, чем-то напоминающее дерево



Дали мне задание сформировать Excel-файл с кучей сложных формул и группировками, как на картинке выше. В сети алгоритм группировки нигде не нашел, наверное плохо искал
Пришлось делать свой велосипед. Здесь список полей для группировки хранится в переменной $fields (это названия полей нашего Dataset, с учетом регистра)
Плюсы:
- хорошая скорость и мало кода
- универсальность (в $fields может быть сколько угодно полей из нашего Dataset, вложенность уровней будет правильной)
- переменную $fields можно формировать/брать где-то извне
Минусы:
- Dataset должен быть заранее отсортирован на сервере (для моей задачи это оказалось быстрее, чем копировать весь Dataset в массив php, а потом этот массив сортировать)
PHP код:
function utf8($s) {return iconv('windows-1251','utf-8//IGNORE',$s);}
$params = [...];
$tsql "SQL command";
$myQuery sqlsrv_query($conn$tsql$params, ["Scrollable" => "buffered"]);

$fields 'fio/mainProject/projectName/taskName';
$keys explode('/'$fields);
$arr = [];
while (
$row sqlsrv_fetch_array ($myQuery,SQLSRV_FETCH_ASSOC)) {
    
$ref = &$arr;
    foreach (
$keys as $key) {
        
$ref = &$ref[$row[$key]];
    }
}

echo 
'<style> *{font:11px verdana;} b{font-weight:700;}    td+td{text-align:center;}</style>''<table><tr><td><b>Group element <td><b>Level <td><b>Count';
function 
getGroup($a$level=0) {
    
$level++;
    foreach (
$a as $key => $value) {
        echo 
'<tr><td>'.str_repeat(' ',$level*4).utf8($key), '<td>'$level'<td>'count($value);
        if (
is_array($value)) {getGroup($value,$level);}
  }
}
getGroup($arr,-1);

echo 
'</table>'
Буду рад любым замечаниям и предложениям.

Последний раз редактировалось SQLPowerUser; 02.02.2017 в 15:59.
SQLPowerUser вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка группировки Dexes SQL, базы данных 4 01.09.2021 10:08
Алгоритм пути на PHP ... s88s PHP 3 30.05.2016 13:49
условия группировки der90 SQL, базы данных 1 08.04.2014 12:13
представление группировки Domanoff БД в Delphi 13 07.04.2010 18:09
Группировки в Excel Chelentano Microsoft Office Excel 2 29.07.2009 18:00