Работа с данными

Класс 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