Te presento al método CountBy
Este método se incorporo a las colecciones en la actualización de Laravel 5.8.3 y nos permite hacer un conteo de los elementos que componen un arreglo es decir cuentas los elementos que se repiten.
1 2 3 4 5 6 7 8 9 10 11 | public function countBy($callback = null) { if (is_null($callback)) { $callback = function ($value) { return $value; }; } return new static($this->groupBy($callback)->map(function ($value) { return $value->count(); })); } |
El método countBy espera un closure como argumento principal pero si no es así lo crea y lo pasa aun map que se encarga de hacer el conteo.
Esto es bien interesante porque eso quieres decir que yo puedo crear cualquier lógica que yo quiera para decidir como pasa el elemento al map
Lo que nos abre un mundo de posibilidades!
veamos unos ejemplos
Conteo en un arreglo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | $countElements = collect([ [ 'year' => '2015', 'speakers' => [ 'Jeffrey', 'Taylor', 'Matt', 'Konstantin', 'Jessica', 'Frank', 'Adam', 'Lorna', 'Dries', 'Ben', 'Esther', 'Hannes' ] ], [ 'year' => '2014', 'speakers' => [ 'Taylor', 'Ross', 'Erika', 'Konstantin', 'Andreas', 'Kayla', 'Matthias', 'Mathias', 'Ben', 'Rafael', 'Igor', 'Michelle', 'Adam', 'Xander', 'Wim', 'Mitchell', 'Gabriela', 'Matt', 'Frank', 'Hannes', 'Kirk' ] ], [ 'year' => '2013', 'speakers' => [ 'Taylor', 'Fabien', 'Phill', 'Jordi', 'Kapil', 'Matthew', 'Frank', 'Jeffrey', 'Ben', 'Ross' ] ] ])->pluck('speakers')->countBy(); |
Lo cual nos da como resultado un arreglo con el numero de ocasiones que aparece un participante.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | all: [ "Jeffrey" => 2, "Taylor" => 3, "Matt" => 2, "Konstantin" => 2, "Jessica" => 1, "Frank" => 3, "Adam" => 2, "Lorna" => 1, "Dries" => 1, "Ben" => 3, "Esther" => 1, "Hannes" => 2, "Ross" => 2, "Erika" => 1, "Andreas" => 1, "Kayla" => 1, "Matthias" => 1, "Mathias" => 1, "Rafael" => 1, "Igor" => 1, "Michelle" => 1, "Xander" => 1, "Wim" => 1, "Mitchell" => 1, "Gabriela" => 1, "Kirk" => 1, "Fabien" => 1, "Phill" => 1, "Jordi" => 1, "Kapil" => 1, "Matthew" => 1, ], } |
Conteo usando un closure
1 2 3 4 5 6 7 8 9 10 11 | $countElements = collect([ 'a@yahoo.com', 'b@hotmail.com', 'c@gmail.com', 'd@yahoo.com', 'e@hotmail.com', 'f@gmail.com', 'r@hotmail.com', ])->countBy(function($item){ return substr(strrchr($item, '@'),1); }); |
Los que nos proporciona un conteo de correos por dominio.
1 2 3 4 5 6 | all: [ "yahoo.com" => 2, "hotmail.com" => 3, "gmail.com" => 2, ], } |