Skip to content

Instantly share code, notes, and snippets.

@AgelxNash
Created December 22, 2014 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AgelxNash/15a632440e5e6e4f2f2b to your computer and use it in GitHub Desktop.
Save AgelxNash/15a632440e5e6e4f2f2b to your computer and use it in GitHub Desktop.
Функция для анализа коллекций Laravel
/**
* @param Collection $data
* @param string $key Ключ для записи с числовым значением
* @return Collection
*/
function Analitics(Collection $data, $key){
$out = new Collection;
$sum = $data->sum(function($item) use ($key){
return $item[$key];
});
$avg = ($data->count() > 0) ? ceil($sum / $data->count()) : 0;
$out->put('avg', $avg); //Среднее значение
$out->put('count', $data->count()); //Всего записей
$out->put('sum', $sum); //Общая сумма значений
$out->put('min', $data->min($key)); //Минимальное значение
$out->put('max', $data->max($key)); //Максимальное значение
if($data->count() > 0) {
$data->sortBy($key);
$tmp = $data->chunk(ceil($data->count() / 2));
}else{
$tmp = new Collection;
}
/** @var Collection $minData */
$minData = $tmp->has(0) ? $tmp->get(0) : $data;
/** @var Collection $maxData */
$maxData = $tmp->has(1) ? $tmp->get(1) : new Collection;
$out->put('leftMedianCount', $minData->count()); //Записей слева от медианы
$out->put('rightMedianCount', $maxData->count()); //Записей справа от медианы
$out->put('medianValue', ($data->count() % 2 == 0) ? ceil(($minData->max($key) + $maxData->min($key))/2) : $minData->max($key)); //Медианное значение
if($minData->count() > 0) {
$tmp = $minData->chunk(ceil($minData->count() / 2));
}else{
$tmp = new Collection;
}
$medianMinUser = $tmp->has(1) ? $tmp->get(1) : $minData;
$out->put('downKvartal', $medianMinUser->min($key)); //Нижная кварталь
$tmp = $data->filter(function($el) use($key, $out){
return ($el[$key] < $out->get('downKvartal'));
});
$out->put('beforeDownKvartal', ($tmp instanceof Collection) ? $tmp->count() : 0); //Записей меньше среднего значения
if($maxData->count() > 0) {
$tmp = $maxData->chunk(ceil($maxData->count() / 2));
}else{
$tmp = new Collection;
}
$medianMaxUser = $tmp->has(0) ? $tmp->get(0) : $maxData;
$out->put('upKvartal', $medianMaxUser->max($key)); //верхная кварталь
if($out->get('upKvartal')==0){
$out->put('upKvartal', $out->get('downKvartal'));
}
$tmp = $data->filter(function($el) use($key, $out){
return ($el[$key] > $out->get('upKvartal'));
});
$out->put('afterUpKvartal', ($tmp instanceof Collection) ? $tmp->count() : 0); //Записей больше среднего значения*/
$out->put('dataKvartal', ($out->get('count') - ($out->get('afterUpKvartal') + $out->get('beforeDownKvartal')))); //записей между нижней и верхней кваралью
return $out;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment