Gamedev рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдо рддреМрд░ рдкрд░ рдпрд╛ PHP рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ



рд╣реЗрд▓реЛ, рд╣реИрдмрд░ред

рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рдкреНрд░реЛ PHP рдирд╛рдордХ рдПрдХ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХ рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдЖ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреВрд░рд╛ рдЦрдВрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╣реА рд╣реЛрдмреЗ (рдФрд░ рд╢рд╛рдпрдж рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░) рдкрд░ рдЙрдард╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗ рдХрд╛рдлреА рддрд▓рд╛рдХрд╢реБрджрд╛ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП - рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдорджрдж рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ - рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдкрд╢реБ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ?


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред Php рдореЗрдВ рдПрдХ Iterator рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред SPL ( Standart PHP рд▓рд╛рдЗрдмреНрд░реЗрд░реА ) рдореЗрдВ рдХрдИ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЖрдо рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХреА рд╕реВрдЪреА рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ ред

рддреЛ рд╣рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ - рдХреНрдпрд╛ рд╣рдо рдХреЗрд╡рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?


Php рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдЖ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдпрд╛ рдбреЗрдЯрд╛ рдХреА рдЧрдгрдирд╛ рдмрд╕ рдПрдХ рд╕рд░рдгреА рдореЗрдВ "рдЬреЛрдбрд╝реА" рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ 9 рд╕рдорд╛рди рднрд╛рдЧреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдбреЗрдЯрд╛ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдШреВрдордиреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд░рдгреА рдореЗрдВ рд╡реЗ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдореБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

рддреЛ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВрдЧреЗред рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдлрд┐рд░ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдХреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдкрдбрд╝реЛрд╕реА рдорд╛рдирдЪрд┐рддреНрд░ рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдиреАрдЪреЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

/** * @link https://bitbucket.org/t1gor/strategy/src/242e58cdcd60c61d02ae26d420da9d415117cb0d/application/model/map/MapTileNeighboursIterator.php?at=default */ class TileIterator implements Iterator { private $_side = 'north_west'; private $_neighbours = array(); private $_isValid = true; public function __construct($neighboursArray) { $this->_side = 'north_west'; $this->_neighbours = $neighboursArray; } /** * @return void */ function rewind() { $this->_side = 'north_west'; } /** * @return MapTile */ function current() { return $this->_neighbours[$this->_side]; } /** * @return string */ function key() { return $this->_side; } /** * Loop through neighbours clock-wise * * @return void */ function next() { switch ($this->_side) { case 'north_west': $this->_side = 'north'; break; case 'north': $this->_side = 'north_east'; break; case 'north_east': $this->_side = 'east'; break; case 'east': $this->_side = 'south_east'; break; case 'south_east': $this->_side = 'south'; break; case 'south': $this->_side = 'south_west'; break; case 'south_west': $this->_side = 'west'; break; // this is the end of a circle case 'west': $this->_isValid = false; break; } } function valid() { return $this->_isValid; } } 

рдФрд░ рдЕрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓:
 //   , ..     $tilesStmt = PDO::prepare("SELECT * FROM tiles ... LIMIT 9"); $tilesStmt->execute(); $tiles = new TileIterator($tilesStmt->fetchAll()); 

рдареАрдХ рд╣реИ, рддреЛ - рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд, рдХреЗрд╡рд▓ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдмрд╕реНрдЯрд┐рдВрдЧ:
 foreach ($tiles as $tile) { ... } 

рд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?


рдЪреВрдВрдХрд┐ рд╡рд┐рд╖рдп рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛:

рдбрд┐рдмрдЧрд┐рдВрдЧ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп LimitIterator рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, PHPExcel рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп , рддрд╛рд░ рдкрд░ рдЪрд▓рдиреЗ рдореЗрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд░реЛрдЯрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ Iterator рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рдбреНрд░реИрдЧрд┐рдВрдЧ" рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд░реЛрдЯрд░ рдХреЛ LimitIterator рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рджрд░реНрдЬрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 //   ... $inputFileType = PHPExcel_IOFactory::identify('example.xlsx'); $objReader = PHPExcel_IOFactory::createReader($inputFileType); $document = $objReader->load($inputFile); $sheet = $document->getSheet(0); // ...     10  $dataForDebug = new LimitIterator($sheet->getRowIterator(), 0, 10); 

FilterIterator рд╡рд░реНрдЧ рдлреНрд▓рд╛рдИ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рддрд░рд╣ рд╕реЗ, рдпрд╣ SQL рдХреНрд╡реЗрд░реА рдХреЗ WHERE рднрд╛рдЧ рдХреЗ рд╕рдорд╛рди рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреЗрд╕рдХреИрдВрдк рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдкреАрдЖрдИ , рдЬрд┐рд╕рдХрд╛ рдПрд╕рдбреАрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЖрдкрдХреЛ 3 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдИрдореЗрд▓, рдЖрдИрдбреА рдФрд░ рдирд╛рдоред рдЙрдкрд░реНрдпреБрдХреНрдд рд╡рд░реНрдЧ рдЗрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 /** * @link http://ua2.php.net/FilterIterator */ class NotificationFilter extends FilterIterator { /** *      */ private $_skip; /** * Build filter * * @param Iterator $iterator * @param array $filter -    ,    * @throws InvalidArgumentException */ public function __construct(Iterator $iterator, $filter) { if (!is_array($filter)) { throw new InvalidArgumentException("Filter should be an array. ".gettype($filter)." given."); } parent::__construct($iterator); $this->_skip = $filter; } /** * Check user data and make sure we can notify him/her * * Filtering by 2 params: * - Does the user belong to your company (avoid spamming clients)? * - Should we skipp the user based on the user ID * - Should we skipp the user based on the user email * * @link http://php.net/manual/filteriterator.accept.php * @link https://github.com/sirprize/basecamp/blob/master/example/basecamp/person/get-by-id * * @return bool */ public function accept() { // get current user from the Iterator $bcUser = $this->getInnerIterator()->current(); // check if skipped by ID $skippedById = in_array($bcUser->getId(), $this->_skip['byID']); // or by email $skippedByEmail = in_array($bcUser->getEmailAddress(), $this->_skip['byEmail']); // check that he/she belongs to your company $belongsToCompany = $yourCompanyBaseCampID === (int) $bcUser->getCompanyId()->__toString(); // notify only if belongs to your company and shouldn't be skipped return $belongsToCompany && !$skippedById && !$skippedByEmail; } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, NotificationFilter :: accept () рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдЖрдк RecursiveIteratorIterator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдПрдХ-рдЖрдпрд╛рдореА рд╡рд╛рд▓реЗ рдХрд╛рд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ RecursiveDirectoryIterator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рдлрд╝рд╛рдЗрд▓ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ , рдФрд░ рдмрд╣реБрдд рдХреБрдЫред

рдФрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╣рд╛рдВ рд╣реИ?


рд╣рд╛рдВ, рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рдЬрдм рдореИрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде "рдЦреЗрд▓" рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪрд╛рд░ рдереЗ - рдореИрдВ рдХреЗрд╡рд▓ рд╣реЗрдмреЗрд░ рдкрд░ рдкреЛрд╕реНрдЯ рдХреИрд╕реЗ рдкрдврд╝реВрдВрдЧрд╛ рдЬреЛ рдХрд┐ рдЧреЗрдордбреЗрд╡ рд╣рдм рдФрд░ рд╡реЗрдм рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рджреЛрдиреЛрдВ рдореЗрдВ рд╣реИрдВ? рдлрд╝реАрдб рдореЗрдВ, рдЖрдк рджреЛрдиреЛрдВ рд╣рдмреНрд╕ рд╕реЗ рдкреЛрд╕реНрдЯ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдирд╣реАрдВ, рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдирддреАрдЬрддрди, рдореБрдЭреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ред

рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб BitBucket рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ред рдиреАрдЪреЗ рдХреЛрдб:
 /** * Basic post class */ class HabraPost { public $name = ''; public $url = ''; public $hubs = null; public static $baseUrl = 'http://habrahabr.ru/hub/'; /** * Some hubs links */ protected static $fullHubList = array( 'infosecurity' => ' ', 'webdev' => '-', 'gdev' => 'Game Development', 'DIY' => 'DIY   ', 'pm' => ' ', 'programming' => '', 'space' => '', 'hardware' => '', 'algorithms' => '', 'image_processing' => ' ', ); public function __construct($name, $url, $hubs = array()) { $this->name = $name; $this->url = $url; $this->hubs = $hubs; } public static function getFullHubsList() { $list = self::$fullHubList; asort($list); return $list; } } /** * Post storage object * * @link http://php.net/manual/class.splobjectstorage.php */ class PostsStorage { private $_iterator; public function __construct() { $this->_iterator = new SplObjectStorage(); } /** * Add new post * * @param HabraPost $post * @return void */ public function save(HabraPost $post) { // reduce duplicates if (!$this->_iterator->contains($post)) { $this->_iterator->attach($post); } } /** * Get internal iterator * * @return SplObjectStorage */ public function getIterator() { return $this->_iterator; } } /** * Posts filtering class * * @link http://php.net/manual/class.filteriterator.php */ class HabraPostFilter extends FilterIterator { /** * Hubs to filter by */ private $_filterByHubs = array(); public function __construct(Iterator $iterator, $filteringHubs) { parent::__construct($iterator); $this->_filterByHubs = $filteringHubs; } /** * Accept * * @link http://php.net/manual/filteriterator.accept.php * @return bool */ public function accept() { $object = $this->getInnerIterator()->current(); $aggregate = true; foreach ($this->_filterByHubs as $filterHub) { $aggregate = $aggregate && in_array($filterHub, $object->hubs); } return $aggregate; } } 

рддреЛ - рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╣рдм рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ,
  2. рд╣рдо рдЙрдкрд▓рдмреНрдз рд╣реИрдмрд░ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ,
  3. рд╣рдо рдпрд╣ рд╕рдм PostsStorage рдореЗрдВ PostsStorage ,
  4. рдФрд░ HabraPostFilter рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:

GameDev + рд╡реЗрдм рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ


рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдореБрдлреНрдд рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрдЧрд░ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдмрд░рд╛ рдкреНрд░рднрд╛рд╡ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред

PS рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреЛрд╕реНрдЯ рдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрддреНрд░рд╛рдЪрд╛рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ / рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдпреВрдкреАрдбреА рдореБрдЭреЗ рдЯрд╛рдЗрдкреЛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Nikita_Rogatnev рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
рдпреВрдкреАрдбреА рдзрдиреНрдпрд╡рд╛рдж hell0w0rd рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП ред

Source: https://habr.com/ru/post/In214833/


All Articles