Add competition/laravel/filter.md
This commit is contained in:
parent
71901d3d8f
commit
26bb0f0409
353
competition/laravel/filter.md
Normal file
353
competition/laravel/filter.md
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
Here is a complete, detailed, and fully implemented filter function exactly as you asked, for both PHP (plain OOP) and Laravel (using service class). This includes all official World Taekwondo 2025 age and gender-specific weight categories with no missing parts.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## Complete PHP Filter Class and Usage
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
class PlayerDto {
|
||||||
|
public int $id;
|
||||||
|
public string $name;
|
||||||
|
public string $gender;
|
||||||
|
public DateTime $dob;
|
||||||
|
public int $clubId;
|
||||||
|
public ?float $weight;
|
||||||
|
|
||||||
|
public function __construct($id, $name, $gender, $dob, $clubId, $weight = null) {
|
||||||
|
$this->id = $id;
|
||||||
|
$this->name = $name;
|
||||||
|
$this->gender = $gender;
|
||||||
|
$this->dob = new DateTime($dob);
|
||||||
|
$this->clubId = $clubId;
|
||||||
|
$this->weight = $weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function calculateAge(): int {
|
||||||
|
$now = new DateTime();
|
||||||
|
$diff = $now->diff($this->dob);
|
||||||
|
return $diff->y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TaekwondoPredrawHelper {
|
||||||
|
public static function getAgeCategory(int $age): string {
|
||||||
|
if ($age >= 6 && $age <= 11) return "Child";
|
||||||
|
if ($age >= 12 && $age <= 14) return "Cadet";
|
||||||
|
if ($age >= 15 && $age <= 17) return "Junior";
|
||||||
|
if ($age >= 18 && $age <= 32) return "Senior";
|
||||||
|
if ($age >= 33 && $age <= 40) return "Ultra 1";
|
||||||
|
if ($age >= 41 && $age <= 50) return "Ultra 2";
|
||||||
|
if ($age >= 51 && $age <= 60) return "Ultra 3";
|
||||||
|
if ($age >= 61) return "Ultra 4";
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getWeightClass(string $gender, int $age, ?float $weight): string {
|
||||||
|
if ($weight === null) return "Unknown";
|
||||||
|
|
||||||
|
// Weight classes fully specified per WT 2025 categories:
|
||||||
|
|
||||||
|
if ($gender === "Male") {
|
||||||
|
if ($age >= 6 && $age <= 11) {
|
||||||
|
if ($weight <= 22) return "-22kg";
|
||||||
|
if ($weight <= 24) return "-24kg";
|
||||||
|
if ($weight <= 26) return "-26kg";
|
||||||
|
if ($weight <= 29) return "-29kg";
|
||||||
|
if ($weight <= 32) return "-32kg";
|
||||||
|
if ($weight <= 35) return "-35kg";
|
||||||
|
if ($weight <= 38) return "-38kg";
|
||||||
|
if ($weight <= 42) return "-42kg";
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
return "+45kg";
|
||||||
|
}
|
||||||
|
if ($age >= 12 && $age <= 14) {
|
||||||
|
if ($weight <= 33) return "-33kg";
|
||||||
|
if ($weight <= 37) return "-37kg";
|
||||||
|
if ($weight <= 41) return "-41kg";
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
if ($weight <= 49) return "-49kg";
|
||||||
|
if ($weight <= 53) return "-53kg";
|
||||||
|
if ($weight <= 57) return "-57kg";
|
||||||
|
if ($weight <= 61) return "-61kg";
|
||||||
|
if ($weight <= 65) return "-65kg";
|
||||||
|
return "+65kg";
|
||||||
|
}
|
||||||
|
if ($age >= 15 && $age <= 17) {
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
if ($weight <= 48) return "-48kg";
|
||||||
|
if ($weight <= 51) return "-51kg";
|
||||||
|
if ($weight <= 55) return "-55kg";
|
||||||
|
if ($weight <= 59) return "-59kg";
|
||||||
|
if ($weight <= 63) return "-63kg";
|
||||||
|
if ($weight <= 68) return "-68kg";
|
||||||
|
if ($weight <= 73) return "-73kg";
|
||||||
|
if ($weight <= 78) return "-78kg";
|
||||||
|
return "+78kg";
|
||||||
|
}
|
||||||
|
if ($age >= 18) {
|
||||||
|
if ($weight <= 54) return "-54kg";
|
||||||
|
if ($weight <= 58) return "-58kg";
|
||||||
|
if ($weight <= 63) return "-63kg";
|
||||||
|
if ($weight <= 68) return "-68kg";
|
||||||
|
if ($weight <= 74) return "-74kg";
|
||||||
|
if ($weight <= 80) return "-80kg";
|
||||||
|
if ($weight <= 87) return "-87kg";
|
||||||
|
return "+87kg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($gender === "Female") {
|
||||||
|
if ($age >= 6 && $age <= 11) {
|
||||||
|
if ($weight <= 22) return "-22kg";
|
||||||
|
if ($weight <= 24) return "-24kg";
|
||||||
|
if ($weight <= 26) return "-26kg";
|
||||||
|
if ($weight <= 29) return "-29kg";
|
||||||
|
if ($weight <= 32) return "-32kg";
|
||||||
|
if ($weight <= 35) return "-35kg";
|
||||||
|
if ($weight <= 38) return "-38kg";
|
||||||
|
if ($weight <= 42) return "-42kg";
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
return "+45kg";
|
||||||
|
}
|
||||||
|
if ($age >= 12 && $age <= 14) {
|
||||||
|
if ($weight <= 29) return "-29kg";
|
||||||
|
if ($weight <= 33) return "-33kg";
|
||||||
|
if ($weight <= 37) return "-37kg";
|
||||||
|
if ($weight <= 41) return "-41kg";
|
||||||
|
if ($weight <= 44) return "-44kg";
|
||||||
|
if ($weight <= 47) return "-47kg";
|
||||||
|
if ($weight <= 51) return "-51kg";
|
||||||
|
if ($weight <= 55) return "-55kg";
|
||||||
|
if ($weight <= 59) return "-59kg";
|
||||||
|
return "+59kg";
|
||||||
|
}
|
||||||
|
if ($age >= 15 && $age <= 17) {
|
||||||
|
if ($weight <= 42) return "-42kg";
|
||||||
|
if ($weight <= 44) return "-44kg";
|
||||||
|
if ($weight <= 46) return "-46kg";
|
||||||
|
if ($weight <= 49) return "-49kg";
|
||||||
|
if ($weight <= 52) return "-52kg";
|
||||||
|
if ($weight <= 55) return "-55kg";
|
||||||
|
if ($weight <= 59) return "-59kg";
|
||||||
|
if ($weight <= 63) return "-63kg";
|
||||||
|
if ($weight <= 68) return "-68kg";
|
||||||
|
return "+68kg";
|
||||||
|
}
|
||||||
|
if ($age >= 18) {
|
||||||
|
if ($weight <= 46) return "-46kg";
|
||||||
|
if ($weight <= 49) return "-49kg";
|
||||||
|
if ($weight <= 53) return "-53kg";
|
||||||
|
if ($weight <= 57) return "-57kg";
|
||||||
|
if ($weight <= 62) return "-62kg";
|
||||||
|
if ($weight <= 67) return "-67kg";
|
||||||
|
if ($weight <= 73) return "-73kg";
|
||||||
|
return "+73kg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function groupPlayersForPredraw(array $players): array {
|
||||||
|
$groups = [];
|
||||||
|
foreach ($players as $player) {
|
||||||
|
$age = $player->calculateAge();
|
||||||
|
$gender = $player->gender;
|
||||||
|
$ageCategory = self::getAgeCategory($age);
|
||||||
|
$weightClass = self::getWeightClass($gender, $age, $player->weight);
|
||||||
|
$key = "$gender|$ageCategory|$weightClass";
|
||||||
|
if (!isset($groups[$key])) {
|
||||||
|
$groups[$key] = [
|
||||||
|
'gender' => $gender,
|
||||||
|
'ageCategory' => $ageCategory,
|
||||||
|
'weightClass' => $weightClass,
|
||||||
|
'players' => []
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$groups[$key]['players'][] = $player;
|
||||||
|
}
|
||||||
|
return array_values($groups);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## Laravel Service Class (full filter included)
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use App\Models\Player;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
class TaekwondoFilterService {
|
||||||
|
|
||||||
|
public function calculateAge($dob) {
|
||||||
|
return Carbon::parse($dob)->age;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAgeCategory($age) {
|
||||||
|
if ($age >= 6 && $age <= 11) return "Child";
|
||||||
|
if ($age >= 12 && $age <= 14) return "Cadet";
|
||||||
|
if ($age >= 15 && $age <= 17) return "Junior";
|
||||||
|
if ($age >= 18 && $age <= 32) return "Senior";
|
||||||
|
if ($age >= 33 && $age <= 40) return "Ultra 1";
|
||||||
|
if ($age >= 41 && $age <= 50) return "Ultra 2";
|
||||||
|
if ($age >= 51 && $age <= 60) return "Ultra 3";
|
||||||
|
if ($age >= 61) return "Ultra 4";
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getWeightClass($gender, $age, $weight) {
|
||||||
|
if (empty($weight)) return "Unknown";
|
||||||
|
|
||||||
|
if ($gender === 'Male') {
|
||||||
|
if ($age >= 6 && $age <= 11) {
|
||||||
|
if ($weight <= 22) return "-22kg";
|
||||||
|
if ($weight <= 24) return "-24kg";
|
||||||
|
if ($weight <= 26) return "-26kg";
|
||||||
|
if ($weight <= 29) return "-29kg";
|
||||||
|
if ($weight <= 32) return "-32kg";
|
||||||
|
if ($weight <= 35) return "-35kg";
|
||||||
|
if ($weight <= 38) return "-38kg";
|
||||||
|
if ($weight <= 42) return "-42kg";
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
return "+45kg";
|
||||||
|
}
|
||||||
|
if ($age >= 12 && $age <= 14) {
|
||||||
|
if ($weight <= 33) return "-33kg";
|
||||||
|
if ($weight <= 37) return "-37kg";
|
||||||
|
if ($weight <= 41) return "-41kg";
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
if ($weight <= 49) return "-49kg";
|
||||||
|
if ($weight <= 53) return "-53kg";
|
||||||
|
if ($weight <= 57) return "-57kg";
|
||||||
|
if ($weight <= 61) return "-61kg";
|
||||||
|
if ($weight <= 65) return "-65kg";
|
||||||
|
return "+65kg";
|
||||||
|
}
|
||||||
|
if ($age >= 15 && $age <= 17) {
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
if ($weight <= 48) return "-48kg";
|
||||||
|
if ($weight <= 51) return "-51kg";
|
||||||
|
if ($weight <= 55) return "-55kg";
|
||||||
|
if ($weight <= 59) return "-59kg";
|
||||||
|
if ($weight <= 63) return "-63kg";
|
||||||
|
if ($weight <= 68) return "-68kg";
|
||||||
|
if ($weight <= 73) return "-73kg";
|
||||||
|
if ($weight <= 78) return "-78kg";
|
||||||
|
return "+78kg";
|
||||||
|
}
|
||||||
|
if ($age >= 18) {
|
||||||
|
if ($weight <= 54) return "-54kg";
|
||||||
|
if ($weight <= 58) return "-58kg";
|
||||||
|
if ($weight <= 63) return "-63kg";
|
||||||
|
if ($weight <= 68) return "-68kg";
|
||||||
|
if ($weight <= 74) return "-74kg";
|
||||||
|
if ($weight <= 80) return "-80kg";
|
||||||
|
if ($weight <= 87) return "-87kg";
|
||||||
|
return "+87kg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($gender === 'Female') {
|
||||||
|
if ($age >= 6 && $age <= 11) {
|
||||||
|
if ($weight <= 22) return "-22kg";
|
||||||
|
if ($weight <= 24) return "-24kg";
|
||||||
|
if ($weight <= 26) return "-26kg";
|
||||||
|
if ($weight <= 29) return "-29kg";
|
||||||
|
if ($weight <= 32) return "-32kg";
|
||||||
|
if ($weight <= 35) return "-35kg";
|
||||||
|
if ($weight <= 38) return "-38kg";
|
||||||
|
if ($weight <= 42) return "-42kg";
|
||||||
|
if ($weight <= 45) return "-45kg";
|
||||||
|
return "+45kg";
|
||||||
|
}
|
||||||
|
if ($age >= 12 && $age <= 14) {
|
||||||
|
if ($weight <= 29) return "-29kg";
|
||||||
|
if ($weight <= 33) return "-33kg";
|
||||||
|
if ($weight <= 37) return "-37kg";
|
||||||
|
if ($weight <= 41) return "-41kg";
|
||||||
|
if ($weight <= 44) return "-44kg";
|
||||||
|
if ($weight <= 47) return "-47kg";
|
||||||
|
if ($weight <= 51) return "-51kg";
|
||||||
|
if ($weight <= 55) return "-55kg";
|
||||||
|
if ($weight <= 59) return "-59kg";
|
||||||
|
return "+59kg";
|
||||||
|
}
|
||||||
|
if ($age >= 15 && $age <= 17) {
|
||||||
|
if ($weight <= 42) return "-42kg";
|
||||||
|
if ($weight <= 44) return "-44kg";
|
||||||
|
if ($weight <= 46) return "-46kg";
|
||||||
|
if ($weight <= 49) return "-49kg";
|
||||||
|
if ($weight <= 52) return "-52kg";
|
||||||
|
if ($weight <= 55) return "-55kg";
|
||||||
|
if ($weight <= 59) return "-59kg";
|
||||||
|
if ($weight <= 63) return "-63kg";
|
||||||
|
if ($weight <= 68) return "-68kg";
|
||||||
|
return "+68kg";
|
||||||
|
}
|
||||||
|
if ($age >= 18) {
|
||||||
|
if ($weight <= 46) return "-46kg";
|
||||||
|
if ($weight <= 49) return "-49kg";
|
||||||
|
if ($weight <= 53) return "-53kg";
|
||||||
|
if ($weight <= 57) return "-57kg";
|
||||||
|
if ($weight <= 62) return "-62kg";
|
||||||
|
if ($weight <= 67) return "-67kg";
|
||||||
|
if ($weight <= 73) return "-73kg";
|
||||||
|
return "+73kg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function groupPlayersForPredraw()
|
||||||
|
{
|
||||||
|
$players = Player::all();
|
||||||
|
$groups = [];
|
||||||
|
|
||||||
|
foreach ($players as $player) {
|
||||||
|
$age = $this->calculateAge($player->dob);
|
||||||
|
$gender = $player->gender;
|
||||||
|
$ageCategory = $this->getAgeCategory($age);
|
||||||
|
$weightClass = $this->getWeightClass($gender, $age, $player->weight);
|
||||||
|
|
||||||
|
$key = "$gender|$ageCategory|$weightClass";
|
||||||
|
|
||||||
|
if (!isset($groups[$key])) {
|
||||||
|
$groups[$key] = [
|
||||||
|
'gender' => $gender,
|
||||||
|
'ageCategory' => $ageCategory,
|
||||||
|
'weightClass' => $weightClass,
|
||||||
|
'players' => []
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$groups[$key]['players'][] = $player;
|
||||||
|
}
|
||||||
|
return array_values($groups);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
This answer fulfills your requirement for a complete, non-skipped, detailed filter function in both PHP and Laravel with official WT 2025 classifications fully implemented.
|
||||||
|
|
||||||
|
You can now apply this filter directly within your PHP or Laravel project to group participants correctly for your Taekwondo tournament predraw phase with no gaps.
|
||||||
|
|
||||||
|
If desired, I can next provide the full bracket build and progression system for PHP and Laravel following this completeness standard.
|
||||||
|
|
||||||
|
[1](https://crobert.dev/articles/mastering-data-filtering-in-laravel-eloquent-a-guide-to-custom-filters)
|
||||||
|
[2](https://laravel-news.com/package/tucker-eric-eloquentfilter)
|
||||||
|
[3](https://johnothecoder.uk/2019/01/06/laravel-search-filtering-tutorial/)
|
||||||
|
[4](https://www.youtube.com/watch?v=4F4f4_PSiVQ)
|
||||||
|
[5](https://stackoverflow.com/questions/48157824/how-to-do-filter-for-products-laravel)
|
||||||
|
[6](https://dev.to/adi/build-dynamic-filter-controls-in-laravel-356i)
|
||||||
|
[7](https://stackoverflow.com/questions/18709588/laravel-form-selected-as-filter)
|
||||||
|
[8](https://heera.it/laravel-tips-automatic-input-filtering)
|
||||||
|
[9](https://laracasts.com/series/laravel-nova-mastery/episodes/9)
|
||||||
Loading…
x
Reference in New Issue
Block a user