
ãªãLINQã§ããïŒ
æ°ããæè¡ã¯åžžã«èå³æ·±ããã®ã§ãã ãªãçºçããã®ããã©ã®ãããªåé¡ã解決ããã©ã®ããã«è§£æ±ºããã®ãïŒ ãã®ãããªæ©èœã®1ã€ããããŒã¿ã·ãŒã±ã³ã¹ïŒé åãããŒã¿ããŒã¹å¿çãã³ã¬ã¯ã·ã§ã³ïŒãã¯ãšãªããããã®SQLã«äŒŒãèšèªã§ããLINQïŒLanguage Integrated QueryïŒã§ãã äŸãã°var q = from c in db.Customers where c.Activity == 1 select new { c.CompanyName, c.ItemID, c.ItemName };
CïŒã§ã¯ããã®æ§æã®ãµããŒãã¯èšèªã¬ãã«ã§çµã¿èŸŒãŸããŠããŸãããå®éã«ã¯æ§æç³ã§ããã次ã®åœ¢åŒã«å€æãããŸã
var q = db.Customers. Where((c) => c.Activity == 1). Select((c) => { c.CompanyName, c.ItemID, c.ItemName });
ããã§ã
Where
ããã³
Select
é¢æ°ã¯ããŒã¿ã·ãŒã±ã³ã¹ã«å¯ŸããŠå®çŸ©ãããŠããŸãããåŠçããžãã¯ã¯åäžã®èŠçŽ ã«å¯ŸããŠèšå®ãããŠããŸãã é¢æ°åããã°ã©ãã³ã°ã®ç²Ÿç¥ã§äœãããŠããŸã-ãã¹ãŠãé¢æ°ã§ãããé¢æ°ã®èšç®çµæã¯å ¥åãã©ã¡ãŒã¿ãŒã®ã¿ã«äŸåããŸãã é¢æ°ã®çŽåºŠã®èŠä»¶ã«ãããå¯äœçšã«ãããšã©ãŒãäºåã«æé€ã§ããŸãã ä»ã«ããã©ã¹ããããŸãïŒ
- åŠçã®é åºã¯éèŠã§ã¯ãªããããã»ããã«å¯ŸããåŠçã¯äžŠè¡ããŠå®è¡ã§ããŸãã
- ããŒã«ã«åæã®ä»£ããã«ãLINQã¯ãšãªãïŒéšåçã«å«ãïŒéåžžã®SQLããŒã¿ããŒã¹ã¯ãšãªã«ãŸãšããããšãã§ããŸãã å€éšããã®ãªã¯ãšã¹ãã¯åããŸãŸã§ãã
- åã ã®èŠçŽ ã®åŠçããžãã¯ã¯åé¢ãããŠããŸãã ä»ã®ã³ã¬ã¯ã·ã§ã³ã«åå©çšããããä»ã®ã³ã¬ã¯ã·ã§ã³ãšçµã¿åããããã§ããŸãã
ãªãã³ããŒã§ããªãã®ã§ããïŒ
PHPã®ã©ã€ãã©ãªãã³ããŒããã«ã¯ãäžèŠããã ãã§ã¯CïŒã®ã©ã®æ©èœãäžååãªã®ãããªã¹ãããŸãã- ç·©ãã¿ã€ãã³ã° ã ããã¯ãããå©ç¹ã§ãã
- ãªãŒããŒããŒãã¡ãœããã¯ãããŸããã ããã¯åã®æ®µèœã®çµæã§ãã ããšãã°ãæååãé
åããªããžã§ã¯ããæ¯èŒããå¿
èŠãããå Žåãååã
cmpString
ãcmpArray
ãcmpLaptop
3ã€ã®ç°ãªãé¢æ°ãcmpLaptop
ãã1ã€ã®å€§ããªé¢æ°å ã«çœ®ãå¿ èŠããããŸãã äž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ã¯æªãã§ãã æåã®ã±ãŒã¹ã§ã¯ãååã®åæ å ±ããããã®é¢æ°ã䜿çšãããã³ãŒãããè©°ãŸãããŸããã 2çªç®ã®å Žåãæ©èœãæ¡åŒµããããšã¯å°é£ã§ãã - ã¯ã©ã¹æ¡åŒµã¯ãããŸããã ã¡ãœãããèšè¿°ããŠå¥ã®ã¯ã©ã¹ã®ã¡ãœããã§ãããã®ããã«åŒã³åºãããšã¯ã§ããŸãããã€ãŸããåå空éãæ¥ç¶ããã ãã§ã¯IEnumerable <T>ãæ¡åŒµã§ããŸããã ããããPHPã«ã¯ãä»ã®å Žæã§å®è£ ãããéçã¡ãœãããåŒã³åºãããšãã§ããéæ³ã®__callã¡ãœããããããŸãã 確ãã«ãç®çã®ã¯ã©ã¹ãå€æŽããå¿ èŠããããŸãããããã¯åžžã«å¯èœãšã¯éããŸããã IDEã§ã®ãµããŒãã«ã€ããŠãå¿ããŠãã䟡å€ããããŸãã
- è¯å¥œãªåçãçæãããžã§ãã¬ãŒã¿ã¯ãããŸããïŒphp <5.5ïŒã äžæ¹ã§ãããã¯æ§æç³ã§ãã
\Iterator
ãè¿ãé¢æ°ãäœæã§ããŸãããã®é¢æ°ã¯ãnext()
ã次ã®èŠçŽ ã®å€ãèšç®ãããã®ç¶æ ãã¯ã©ã¹å±æ§ã«ä¿åããå¿åé¢æ°ãåŒã³åºããŸãã ããããã³ãŒãã®ãµã€ãºã¯äœåºŠãå¢å ãããã®æçšãªã·ã§ã¢ã¯æžå°ããŸãã ãžã§ãã¬ãŒã¿ãŒã¯ããŒãžã§ã³5.5ã§ç»å ŽããŸãããããã®ããŒãžã§ã³ãæ®åãããŸã§ã«é·ãæéãããããŸãã - ã©ã ãåŒã¯ãããŸããã ãããã¯ãæ©èœãå¶éãããŠãããããªå°ããªå¿åé¢æ°ã§ãããæ§é ã«é¢ããæ å ±ã¯ä¿æãããŸãã é¢æ°ã®é¢æ°ãèšå·çã«èšç®ããããåŒãå¥ã®èšèªãããšãã°SQLã«ãšã¯ã¹ããŒããããããããã«äœ¿çšã§ããŸãã PHPã§å¿åé¢æ°ãäœæã§ããŸããããã®æ§é ã«é¢ããæ å ±ã¯ãªããããSQLãžã®ãšã¯ã¹ããŒãã¯ãããŸããã
- ãªãã¬ãŒã¿ãŒã®ãªãŒããŒããŒãã¯ãããŸããã ãŸãã
$f = (Exp::x()+1) * 2
ãããªãã®ãèšè¿°ããClosure
ã®åå«ã§ããExp::x()
ã¡ãœããã«ãã£ãŠè¿ãããã¯ã©ã¹ã®å ç®ããã³ä¹ç®æŒç®ããªãŒããŒããŒãããããšã«ãããã©ã ãåŒãçŸããã·ãã¥ã¬ãŒãããããšã¯ã§ããŸããã
IEnumerator
ã
Iterator
ã
IEnumerable
ã
IteratorAggregate
ïŒãPHPã«é åã®ã¡ãœããããªããªã©ã®å°ããªéãããããããããŸãããããã¯ãã¹ãŠç°¡åã«è§£æ±ºã§ããŸãã
ã©ããã äœããã
ä»äºãå§ããåã«ãç§ã¯ä»ã®äººã®å®è£
ããã§ã¯ãªããCïŒã®å°è±¡ã®äžã§æžãä»ã®ãœãªã¥ãŒã·ã§ã³ãç¹ã«æ¢ããŸããã§ããã æåã®ãªãã·ã§ã³ã¯æ°æ©ã§æžãããŸããã ãã®åŸã圌ã¯é·ãéMSDNãããã¹ãŠã®æšæºã¡ãœããã移ããäœåãªæ©èœãåãåãã.NETã«æºæ ããããžãã¯ããããããŸããã 幎ã®åãã«ãç§ã¯ä»ã®ãããžã§ã¯ãã®æ©èœãæ¯èŒããã³ãŒããä¿®æ£ããgithubã§ãããžã§ã¯ããå
¬éããŸããã éçºäžãäž»ã«æ¬¡ã®ç¹ã«éç¹ã眮ãããŸããã
ã€ãã¬ãŒã¿ã¯ãã¹ãŠã§ããããã¹ãŠã¯ã€ãã¬ãŒã¿ã§ã
ã©ã€ãã©ãªã¯é åããé åã«ã³ããŒããè€éãªã«ãŒãã®ä»£ããã«ãã€ãã¬ãŒã¿ãŒã§åäœããŸãã PHP 5.5ããåã§ã¯ãã€ãã¬ãŒã¿ãŒãåŠçããããã«ã
\Iterator
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããã¯ã©ã¹ãäœæããã³ã³ã¹ãã©ã¯ã¿ãŒ
\Iterator
æž¡ããŠå ¥åãã©ã¡ãŒã¿ãŒãšããŠåŠçããå¿ èŠããããŸããã
$data = new \ArrayIterator([1,2,3]); $even = new \CallbackFilterIterator($data, function ($item) { return $item % 2 == 0; } );
çŸåšã®ã€ãã¬ãŒã¿ããããŒã¿ãèªã¿åããšããããŒã¿ã¯èŠªã€ãã¬ãŒã¿ãããã«ããã³åŠçããå§ããŸãã ã€ãã¬ãŒã¿ãå®è¡ãããªãŒããŒãããã¯æå°éã§ããããã§ãã äžè¬çãªã·ãŒã±ã³ã¹åŠçã¿ã¹ã¯ã«ã¯ã15ãè¶ ããå埩åãå®è£ ãããŠããŸã ã
- CallbackFilterIterator-ã¢ã€ãã ã®ãã£ã«ã¿ãªã³ã°
- CallbackIterator-é¢æ°ã«ããç¡éã·ãŒã±ã³ã¹ã®çæ
- DistinctIterator-äžæã®èŠçŽ ãçºè¡ãã
- ExceptIteratorãIntersectIterator-æžç®ã2ã€ã®ã·ãŒã±ã³ã¹ã®äº€å·®
- GroupingIterator-ããŒã«ããã°ã«ãŒãå
- IndexIterator-ããŒã«ããã¢ã€ãã ã®ãœãŒã
- JoinIteratorãOuterJoinIterator-ããŒã«ãã2ã€ã®ã·ãŒã±ã³ã¹ã®å³å¯ãªãå³å¯ã§ã¯ãªããã€ã³ãã£ã³ã°
- LimitIterator-äžé£ã®ã·ãŒã±ã³ã¹ãçºè¡ãã
- ProductIterator-è€æ°ã®ã€ãã¬ãŒã¿ãŒã®ã¯ãã¹ç©
- ProjectionIterator-èŠçŽ ïŒããŒïŒã®æ圱
- ReverseIterator-é åºãéã«ãã
- SkipIterator-æ¡ä»¶ãtrueã®éèŠçŽ ãã¹ããããã
- TakeIterator-æ¡ä»¶ãçã®ãšãã®èŠçŽ ã®åé¡
- LazyIteratorã¯æœè±¡ã¯ã©ã¹ã§ãã å埩åã¯ãèŠçŽ ãæåã«èªã¿åããããšãã«æ§ç¯ãããŸãã
- VariableIterator-芪ã€ãã¬ãŒã¿ã¯ãã€ãã¬ãŒã¿ãéããåŸã«å€æŽãããå ŽåããããŸã
é 延èšç®ãæ©èœããŸã
å¿åé¢æ°ãLINQã¡ãœããã®åŒãšããŠæž¡ããããšãæé«ã®å®è¡é床ãçŸãã匷調衚瀺ãããã³IDEã§ã®ãªãã¡ã¯ã¿ãªã³ã°ãå¯èœã«ãªããŸãããåŒã®æ§é ã«é¢ããæ å ±ã¯å€±ãããŸãã ããã«ãããSQLãªã©ã®å¥ã®ããã°ã©ãã³ã°èšèªã§åŒãåæ§ç¯ããããšã¯ã§ããŸããã ã©ã ãåŒãšã¯ç°ãªããŸãã ãã®åé¡ã解決ããããã«ãå€ãã®èè ãæå¹ãªPHPã³ãŒãã®æååããåŒããšããŠæž¡ããŸãã æååã¯ãã·ãŒã±ã³ã¹ã®åèŠçŽ ã«å¯ŸããŠevalã䜿çšããŠè©äŸ¡ãããSQLãªã©ã®å¥ã®èšèªã«åãã©ãŒãããã§ããå¯èœæ§ããããŸãã ç¬èªã®æåå圢åŒãããšãã°
$x ==> $x*$x
èãåºã人ãããŸãã ãã®å ŽåãIDEã§ã®ã³ãŒãã®åŒ·èª¿è¡šç€ºãšãªãã¡ã¯ã¿ãªã³ã°ã¯å€±ãããå®è¡ã¯é·ããªããã³ãŒãã¯ãã£ãã·ã¥ããããå®å šã§ã¯ãªããªããŸãã
ææ¡ãããã©ã€ãã©ãªã«ã¯ãè€éãªåŒãç°¡åã«äœæã§ããããŒã«ãäœæãããŠããŸãã åŒã®æ§é ã«é¢ããæ å ±ã¯å€±ããããåŸã§åå©çšã§ããŸãã åºç€ãšãªã
ExpressionBuilder
ã¯ã©ã¹ã¯ãã¹ããªãŒãã³ã°ã¢ãŒãã§èšç®ããªãŒãäœæããéããŒã©ã³ãïŒåŸçœ®ïŒã¬ã³ãŒãã«ãšã¯ã¹ããŒãããŸãã ããšãã°
$exp = new ExpressionBuilder(); $exp->add(1); $exp->add('+',1); $exp->add(2); $exp->export(); // [1, 2, 2, '+']
æäœã®åªå é äœãšæ¬åŒ§ããµããŒããããŠããŸãã
Expression
ã¯ã©ã¹ã¯ãã¢ã³ããŒããããé åãå®è¡ããããŒã¿ã«ééããå Žåããããã¹ã¿ãã¯ã«ã¹ããŒãã
OperationInterface
åã®ãªããžã§ã¯ãã«ééããå Žåãå¶åŸ¡ãããã«è»¢éããŸãã ãªããžã§ã¯ãã¯å¿ èŠãªæ°ã®åŒæ°ãã¹ã¿ãã¯ããååŸããçµæãèšç®ããŠã¹ã¿ãã¯ã«ã¹ããŒããŸãã ã¹ã¿ãã¯ã®æåŸã«ã1ã€ã®å€ïŒçµæïŒãæ®ããŸãã äžäœã¬ãã«ã§ã¯ã
LambdaInstance
ã¯ã©ã¹ãšãã®
Lambda
ãã³ã¬ãŒã¿ãŒã䜿çšããŠåŒãæ§ç¯ãããŸãã æ©äŒã®äŸã
- åŒæ°ãå®æ°ãžã®ã¢ã¯ã»ã¹
/* */ $f = Lambda::v(); $f = function ($x) { return $x; };
- æ°åŠæŒç®ãæ¯èŒæŒç®ãè«çæŒç®
$f = Lambda::v()->add()->v()->mult(12)->gt(36); $f = function ($x) { return $x + $x*12 > 36; };
- æ¬åŒ§
$f = Lambda::v()->mult()->begin()->c(1)->add()->v()->end(); $f = function ($x) { return $x * (1 + $x); };
- æååæäœ
$f = Lambda::v()->like('hallo%');
- é
åçæ
$f = Lambda::complex([ 'a'=>1, 'b'=>Lambda::v() ]); $f = function ($x) { return [ 'a' => 1, 'b' => $x ]; };
- ãªããžã§ã¯ãã®ããããã£ãšã¡ãœãããé
åèŠçŽ ãžã®ã¢ã¯ã»ã¹
$f = Lambda::v()->items('car'); $f = Lambda::v()->getCar(); $f = Lambda::car; $f = function ($x) { return $x->getCar(); };
- ã°ããŒãã«é¢æ°ãåŒã³åºã
$f = Lambda::substr(Lambda::v(), 3, 1)->eq('a'); $f = function ($x) { return substr($x,3,1) == 'a'; };
- å€ã®LINQã¡ãœãã
$f = Lambda::v()->linq()->where(Lambda::v()->gt(1)); $f = function (\Iterator $x) { return new CallbackFilterIterator($x, function ($x) { return $x > 1; }); };
(x)=>x+1
å Žåã
Lambda
èšç®é床ã¯é¢æ°ã®çŽæ¥åŒã³åºããã15åé ããæ§é èªäœã¯800ã«å¯ŸããŠ3600ãã€ãã®ã¡ã¢ãªãå¿ èŠãšããŸãããããã¡ã€ã©ã䜿çšããŠåæããé床ãäžããŠã¡ã¢ãªãåæžããæ¹æ³ãèŠã€ãåºãäºå®ã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã§äŒããå®è£ ãèŠéããŸã
ãã¹ãŠã®LINQã¡ãœããã¯ãæšæºã®.NET 4.5ããååŸãããMSDNã®èª¬æãšãšãã«ã察å¿ããã€ã³ã¿ãŒãã§ã€ã¹ïŒ
GenerationInterface
ã
FilteringInterface
ãªã©ïŒã«æ£åšããŠããŸãã å€ãã®ãã¡ã€ã«ãå€æããŸããããç¹ã«ãã£ãã·ã¥ãæå¹ã«ãªã£ãŠããå Žåã¯ã解æãã¡ã€ã«ãžã®è¿œå ã®è² è·ã¯å€§ãããªãã¯ãã§ãã ã¡ãœããã®ã·ã°ããã£ã¯ãPHPã®æ©èœãèæ ®ããŠãå¯èœãªéãå€æŽãããŠããŸããã
IEnumerable
ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãäžèšã®ãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ãš
\IteratorAggregate
ç¶æ¿ããŸãã
Linq
ã¯ã©ã¹ã¯ãããŒã«ã«åæçšã®
IEnumerable
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸãã å°æ¥ãSQLã¯ãšãªãåéããããDoctrineã®ãã¡ãµãŒãã«ãªã
IEnumerable
å¥ã®å®è£ ãäœæã§ããŸãã 以äžã®ã¡ãœãããå®è£ ãããŠããŸãã
- éèš-éèšãå¹³åãæå°ãæ倧ãåèšãã«ãŠã³ã
- é£çµ-concatãzip
- èŠçŽ -elementAtãelementAtOrDefaultãfirstãfirstOrDefaultãlastãlastOrDefaultãsingleãsingleOrDefault
- å¹³ç-isEqual
- ãã£ã«ã¿ãªã³ã°-ofTypeãããã§
- çæ-ãããç¯å²ãç¹°ãè¿ã
- ã°ã«ãŒãå-groupBy
- åå -productãjoinãjoinOuterãgroupJoin
- ããŒãã£ã·ã§ãã³ã°-skipãskipWhileãtakeãtakeWhile
- ãããžã§ã¯ã·ã§ã³-selectãselectManyãcast
- éæå®å-ãã¹ãŠããã¹ãŠãå«ã
- ã»ãã-åå¥ã亀差ãäŸå€ããŠããªã³
- ãœãŒã-orderByãorderByDescendingãthenByãthenByDescendingãreverseãorder
- ãã®ä»-toArrayãtoListããããã
array
ïŒãé¢æ°ïŒ
callable
ïŒããŸãã¯å埩åïŒ
\Iterator
ã
\IteratorAggregate
ïŒãæå®ã§ããŸãã åæ§ã«ãåŒã«ã¯æååãé¢æ°ïŒ
callable
ïŒãé åïŒ
array
ïŒããŸãã¯ã©ã ãåŒïŒ
\LambdaInterface
ïŒãæž¡ãããšãã§ããŸãã 以äžã«ããã€ãã®äŸã瀺ããŸãããããŸããŸãªåäœãã¹ãããããŸã ã
// Grouping+Sorting+Filtering+array expression $x = Linq::from($cars)->group(Lambda::v()->getCategory()->getId())->select([ 'category' => Lambda::i()->keys(), 'best' => Lambda::v()->linq() ->where(Lambda::v()->isActive()->eq(true)) ->orderBy(Lambda::v()->getPrice()) ->last() ]) // Set + LambdaInterface expression $x = Linq::from($cars)->distinct(Lambda::v()->getCategory()->getTitle()); // Set + string expression $x = Linq::from($cars)->distinct('category.title'); // Generation+callable $fibonacci = function () { $position = 0; $f2 = 0; $f1 = 1; return function () use (&$position, &$f2, &$f1) { $position++; if ($position == 1) { return $f2; } elseif ($position == 2) { return $f1; } else { $f = $f1 + $f2; $f2 = $f1; $f1 = $f; return $f; } } } $x = Linq::from($fibonacci)->take(10);
...ãè¿ãé¢æ°ãè¿ããé¢æ°ãè¿ããé¢æ°
åLINQã¡ãœããã¯ã
Linq
ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæããŸãããã®ãªããžã§ã¯ãã«ã¯ãåæåå¿åé¢æ°ãšãã€ãã¬ãŒã¿ãåæåé¢æ°ã®å ¥åããŒã¿ã§ããä»ã®
Linq
ãªããžã§ã¯ããžã®ãªã³ã¯ãæž¡ãããŸãã
Linq
ã¯
\IteratorAggregate
å®è£ ããŠãããããæåã®èŠçŽ ãèŠæ±ããããšãã€ãã¬ãŒã¿ãŒã¯ãã§ãŒã³ã®äžæ¹ã§èªåçã«åæåãããŸãã
ãªãã§ãããªããšïŒ
æåŸãŸã§èªãã§ãããã¿ããªã«æè¬ããŸãã ãã®ãããžã§ã¯ãã¯ãè³ãšæãèšç·Žããããã«äœããããã®ã§ãããããå®è³ªçãªæ¹å€ã¯200ïŒ ã§æè¿ãããŸãã ç§ã¯æ¬åœã«äœåãå ±æãããã£ãã®ã§ãããããã¯äžè¬ã«æºè¶³ããŠããŸãã ä»ã®äººã«ãšã£ãŠæ¬åœã«äŸ¿å©ãªãã®ã§ããã°ãããã¯äžè¬çã«çŽ æŽãããããšã§ãããã¹ãŠã®ã³ãŒãã¯ææžåããã泚éãä»ãããããã¹ãã§ã«ããŒãããBSDïŒä¿®æ£æžã¿ïŒã©ã€ã»ã³ã¹ã®äžã§githubã«å ¬éãããŸãã ããã¯å®å šã«æ©èœããã©ã€ãã©ãªã§ãã