рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ, PHP рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░,
рдХрд┐рд╕реА рдХреЗ рд╣реИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реБрдЭрд╛рд╡ рдерд╛ рдЬрд┐рд╕рдиреЗ
рдЬрдирд░реЗрдЯрд░, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╕реВрдЪреА рдЖрд╡рдВрдЯрди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛ ред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ PHP рдХреЗ рдХреЛрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВред рдореИрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдФрд░ рдЗрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
XML рдШреЛрд╖рдгрд╛рддреНрдордХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ
рд╕рдмрд╕реЗ рддреЗрдЬ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ рдмрдбрд╝реА XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред
<?php function *readXML($file) { $r = new XMLReader; $r->open($file); while($r->read()) { yield $r; } } function *filterNodes(callable $predicate, $nodes) { foreach($nodes as $node) if($predicate($node)) yield $node; } function matchName($name) { return function($node) use($name) { return $node->name === $name; }; }
рдФрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдгред
<?php function *getArticlesFromXML($file) { foreach(filterNodes(matchName('article'), readXML($file)) as $node) yield nodeToArticle($node); } function nodeToArticle($node) {
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
XMLReader
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рд╡реЗ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдХрд┐
while
рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд┐рдпрдВрддреНрд░рдг рдХреИрд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ "рд╕рдорд╛рдпреЛрдЬрд┐рдд" рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рд░рд▓ рд╕рдЬрд╛рд╡рдЯ
рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореБрдЭреЗ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрдирдХреЗ рдЙрддреНрддрд░ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:
- рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА - рдареАрдХ рд╣реИ, рд╡рд┐рдлрд▓рддрд╛, рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕, рдХрд╛рд░реНрд░рд╡рд╛рдИ, рдкреНрд░рд╛рдкреНрдд-рд╕реЗ-рдХреИрд╢, рдЖрджрд┐ред
- рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХреЗ рджреМрд░рд╛рди рд╕рдЬрд╛рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдореИрдВрдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди рдирд╣реАрдВ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд▓рдЧрд╛рддрд╛рд░ рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред
<?php
рдЕрдзрд┐рдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕рд┐рд╡ рдПрдкреАрдЖрдИ рдлрд┐рд░
рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ, рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд, рдЕрдзрд┐рдХрд╛рдВрд╢ PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдХрдо-рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА, рдФрд░ рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрд╡рд╕рд░ PHP рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд▓реЛрдЧ рдЗрд╕рдореЗрдВ рдХреИрд╕реЗ рджреЗрд░реА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред
рдорд┐рд╢реНрд░рд┐рдд рд╢реИрд▓рд┐рдпреЛрдВ (рдУрдУрдкреА рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╡реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<?php function select() { return func_get_args(); } function from($source) { return $source; } function where() { return func_get_args(); } function *query($select, $from, $where) { foreach($from as $element) { foreach($where as $predicate) { if(false === $predicate($element)) continue 2; } $fields = array(); foreach($select as $selector) { $fields[] = $selector($element); } yield $fields; } } $articles = query( select(property('name')), from(readXML('data.xml')), where(matchName('article')) );
рдпрд╛ рд╢рд╛рдпрдж LINQ рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд┐рд░реНрдорд╛рдг?
рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ ред
рдпрд╣ рдЕрдЬрдЧрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
рдРрд╕реА рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдереАрдВ рдЬрд┐рдирдореЗрдВ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдкрд╣рд▓реВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдереЗред рдореБрдЭреЗ рддрдм рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдФрд░ рдЕрдм рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рдмреБрд░рд╛ рдХреНрдпреЛрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдЕрдЪреНрдЫреА рдЦрдмрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ: рдХреЛрдИ рднреА рднрд╛рд╖рд╛ рдкрд░рд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ (рдмреЗрд╢рдХ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП)ред
рдЦреБрдж рдХреЛ рдкрд░рдЦреЛ
рдпрджрд┐ рдЖрдк рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рд░реБрдЪрд┐ рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЯреИрдм рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
$ git clone -b addListComprehensions https://github.com/nikic/php-src.git $ cd php-src $ ./buildconf $ ./configure $ make cli $ ./sapi/cli/php some-example-file.php