Класс Datawork преобразует данные определенным образом. Работает с массивами и возвращает массивы
c\datawork::$header=array();
c\datawork::$numstring=false;
c\datawork::tag($array);
Преобразует массив $array по ключам, указанным в массиве $headers с группировкой по ключу, указаному в $numstring;
Например:
c\datawork::$header=array(
'ID'=>'ID',
'Фамилия Имя Отчество'=>'FIO',
'Позиция'=>'PLACE'
);
$source=array(
array('Фамилия Имя Отчество','ID','Позиция','Что-то еще'),
array('Иванов Иван Иванович','1','Москва','1'),
array('Петров Петр Петрович','2','Питер','5')
);
$data=c\datawork::tag($source);
print_r($data);
/*
Результат
array(
array('ID'=>'1','FIO'=>'Иванов Иван Иванович','PLACE'=>'Москва'),
array('ID'=>'2','FIO'=>'Петров Петр Петрович','PLACE'=>'Питер'),
)
*/
c\datawork::group($array,$key,$val=false);
Преобразует 2 мерный $array массив по ключу $key.
Если передан $val - вернет массив из $item[$key]=>$item[$val]
Если $val - не передан - просто вернет массив $item[$key]=$item;
Где $item - элемент массива
В качестве массива преобразования можно использовать Closures с функцией расчета промежуточного результата
В качестве значения массива может быть передано '[]' - это означает что для каждого повторного элемента создается новая запись
В качестве $key может быть передан массив из 2-3 значений. В этом случае будет возвращен 2-3 мерный массив с указаной иерархией, например:
$source=array(
array('country'=>'Russia','city'=>'Moscow','street'=>'Tverskaya','code'=>12345),
array('country'=>'Russia','city'=>'Moscow','street'=>'Mayakovskaya','code'=>23456),
array('country'=>'Russia','city'=>'Piter','street'=>'Lenina','code'=111),
);
$data=c\datawork::group($source,array('country','city','street'),'code');
/*
Результат
array(
'Russia'=>array(
'Moscow'=>array(
'Terskaya'=>12345,
'Mayakovskaya'=>23456
),
'Piter'=>array(
'Lenina'=>111
)
)
)
*/
$source=array(
array('country'=>'Russia','city'=>'Moscow','street'=>'Tverskaya','code'=>12345),
array('country'=>'Russia','city'=>'Moscow','street'=>'Mayakovskaya','code'=>23456),
array('country'=>'Russia','city'=>'Piter','street'=>'Lenina','code'=111),
);
$data=c\datawork::group($source,array('country','city','street'),true);
/*
Результат
array(
'Russia'=>array(
'Moscow'=>array(
'Terskaya'=>true,
'Mayakovskaya'=>true
),
'Piter'=>array(
'Lenina'=>true
)
)
)
*/
$source=array(
array('country'=>'Russia','city'=>'Moscow','street'=>'Tverskaya','code'=>12345),
array('country'=>'Russia','city'=>'Moscow','street'=>'Mayakovskaya','code'=>23456),
array('country'=>'Russia','city'=>'Piter','street'=>'Lenina','code'=111),
);
$data=c\datawork::group($source,array('country','city','street'));
/*
Результат
array(
'Russia'=>array(
'Moscow'=>array(
'Terskaya'=>array('country'=>'Russia','city'=>'Moscow','street'=>'Tverskaya','code'=>12345),
'Mayakovskaya'=>array('country'=>'Russia','city'=>'Moscow','street'=>'Mayakovskaya','code'=>23456),
),
'Piter'=>array(
'Lenina'=>array('country'=>'Russia','city'=>'Piter','street'=>'Lenina','code'=111),
)
)
)
*/
$source=array(
array('country'=>'Russia','city'=>'Moscow','street'=>'Tverskaya','code'=>12345),
array('country'=>'Russia','city'=>'Moscow','street'=>'Mayakovskaya','code'=>23456),
array('country'=>'Russia','city'=>'Piter','street'=>'Lenina','code'=111),
);
$data=c\datawork::group($source,array(
'country',
function($row){ return $row['city'].' '.$row['street'];}
),function($row){ return 'Код: '.$row['code'] });
/*
Результат
array(
'Russia'=>array(
'Moscow Terskaya'=>'Код: 12345',
'Moscow Mayakovskaya'=>'Код: 23456',
'Piter Lenina'=>'Код: 111'
)
)
)
*/
$source=array(
array('country'=>'Russia','city'=>'Moscow','street'=>'Tverskaya','code'=>12345),
array('country'=>'Russia','city'=>'Moscow','street'=>'Mayakovskaya','code'=>23456),
array('country'=>'Russia','city'=>'Piter','street'=>'Lenina','code'=111),
);
$data=c\datawork::group($source,array('country','city','[]'),'code');
/*
Результат
array(
'Russia'=>array(
'Moscow'=>array(12345,23456),
'Piter'=>array(111)
)
)
*/
Часто применяется для реализации истории изменений сущностей.
c\datawork::difference($before,$after,$listfields=false)
На вход подаются два двумерных массива и справочник соответствий полей, либо указатель на форму
На выходе появляется подробный массив со всеми различиями.
Проще всего понять все детали на примере
$before_array=array(
'key1'=>'value1',
'key2'=>'old_value',
'status'=>0
);
$after_array=array(
'key1'=>'value1',
'key2'=>'new_value',
'status'=>3
);
$listfields=array(
'key1'=>'Поле 1',
'key2'=>'Поле 2',
'status'=>array(
'name'=>'Статус',
'values'=>array(0=>'Новая',1=>'Принята',2=>'Отменена',3=>'Выполнена')
);
$diff=c\datawork::difference($before_array,$after_array,$listfields);
/*
Результат
array(
'key2'=>array(
'old'=>'old_value',
'old_text'=>'old_value',
'new'=>'new_value',
'new_text'=>'new_value',
'field'=>key2',
'field_text'=>'Поле 2',
'text'=>'"Поле 2" changed from "value2" to "new_value"',
),
'status'=>array(
'old'=>0,
'old_text'=>'Новая',
'new'=>5,
'new_text'=>'Выполнена',
'field'=>status',
'field_text'=>'Статус',
'text'=>'"Статус" changed from "Новая" to "Выполнена"',
)
)
*/
Создано при помощи сервиса Core CMS