<?php
/**
* PHP Challenge vol.7 - Pan od informatyki
*
* Napisz klasę która z imion ze zmiennej $data wyfiltruje imiona zaczynające się
* na wybraną literę, oraz zwróci tablicę imion ze zmienioną pierwszą literę na wielką
*
* Proszę o podział kodu na klasy z zachowaniem zasad SOLID, a szczególnie
* Single responsibility principle (Zasada jednej odpowiedzialności)
*/
require('./autoloader.php');
$data = 'judyta; julia; kamila; karina; laura; lena; magdalena; maja; nadia; natalia; olga; oliwia; pamela; patrycja; regina; renata;
sabina; sandra; tamara; tatiana; urszula; weronika; wiesława; zofia; zuzanna; Żaneta; adam; bartłomiej; bartosz; cezary; cyprian;
damian; daniel; edward; emanuel; fabian; feliks; gabriel; gerard; henryk; herbert; ignacy; igor; jacek; jakub; kacper; kajetan; lech;
leon; maciej; maksymilian; nikodem; norbert; olaf; olgierd; patryk; paweł; radosław; rafał; sebastian; seweryn; tadeusz; teodor; wacław;
waldemar; zdzisław; zygmunt';
// Aby rozpocząć edycję kliknij w przycisk powyżej "Fork this"
// Aby uruchomić moje rozwiązanie należy odkomentować poniższą linijkę
// require('rozwiazanie.php');
<?php
spl_autoload_register(function($class){
$classArr = explode('\\', $class, 2);
if(isset($classArr[1])){
$class = str_replace('\\', '/', $classArr[1]);
$namespce = [
'App' => __DIR__.'/',
];
if(isset($namespce[$classArr[0]]))
{
$path = $namespce[$classArr[0]];
$file = $path.$class.'.php';
if (file_exists($file)) {
require_once($file);
}
}
}
}, true, true);
<?php
use App\IndexController;
/**
* Rozwiązanie
*/
$controller = new IndexController();
$out = $controller->indexAction('t', $data);
var_dump($out);
<?php
namespace App;
class NamesParser {
/**
* Główna funkcja zwracająca listę wyfiltrowanych imion
*/
public function getNamesArray($names){
return $this->getNamesListFromString($names);
}
/**
* Funkcja przetwarzająca ciąg imion w tablicę, jednocześnie usuwając białe znaki z początku i końca imienia
*/
private function getNamesListFromString($data, $separator = ';'){
$data = explode($separator, $data);
foreach($data as &$item){
$item = trim($item);
}
return $data;
}
}
<?php
namespace App;
use App\NamesParser;
use App\NameFormater;
use App\NameFilter;
use App\NamesService;
class IndexController {
/**
* Główna akcja
*/
public function indexAction($firstLetter, $names){
$service = new NamesService($names, new NamesParser(), new NameFilter(), new NameFormater());
return $service->getNames($firstLetter);
}
}
<?php
namespace App;
class NameFormater {
/**
* Funkcja zmieniająca pierwszą literę imienia na wielką
*/
public function upperFirstLetter($data){
array_walk($data, function(&$item){
$item = ucfirst($item);
});
return $data;
}
}
<?php
namespace App;
class NamesService {
private $names;
private $namesParser;
private $nameFilter;
private $nameFormater;
public function __construct($names, $parser, $filter, $formater){
$this->names = $names;
$this->namesParser = $parser;
$this->nameFilter = $filter;
$this->nameFormater = $formater;
}
/**
* Główna funkcja zwracająca listę wyfiltrowanych imion
*/
public function getNames($firstLetter){
$arr = $this->namesParser->getNamesArray($this->names);
$arr = $this->nameFilter->filterByFirstLetter($firstLetter, $arr);
return $this->nameFormater->upperFirstLetter($arr);
}
}
<?php
namespace App;
class NameFilter {
/**
* Funkcja filtrująca listę i zostawiająca tylko imiona zaczynające się na wybraną literę
*/
public function filterByFirstLetter($firstLetter, $names){
$list = array_filter($names, function($item) use ($firstLetter) {
return strtoupper($item[0]) == strtoupper($firstLetter);
});
return $list;
}
}