Created
December 22, 2014 01:14
-
-
Save AgelxNash/15a632440e5e6e4f2f2b to your computer and use it in GitHub Desktop.
Функция для анализа коллекций Laravel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @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