linq / php-linq
快速且现代的库,易于数据处理
1.0.0
2016-10-23 13:32 UTC
This package is not auto-updated.
Last update: 2024-09-18 20:28:02 UTC
README
PHP语言中的Linq技术。
安装
composer require linq/php-linq ~1.0
class Linq
基类,用于在对象集合和数组上执行查询。
方法列表
- from() - 设置主源
- first() - 从集合中返回第一个元素
- last() - 从集合中返回最后一个元素
- select($key = null, $key2 = null) - 返回结果。您可以将可调用者用作第一个参数
- count() - 返回集合的长度
- take($offset, $length = null) - 返回前x个元素 || 返回间隔
- skip($offset) - 跳过x个元素并返回其他数据
- where($condition) - 返回匹配给定条件的元素
- reverse() - 反转集合
- orderBy($column, $desc = false) - 排序。desc = 降序。默认asc = 升序
- distinct() - 返回唯一项
- takeWhile($requirement) - 组合 = where(condition) + select()
- union($array) - SQL中的联合
- groupBy($key) - 分组数据
- innerJoin($array) - 返回同时结合两个字段的元素
- leftJoin($array) - 第一个集合将列出所有条目,即使它们与其他集合没有连接
- on($condition) - 连接两个集合的条件
- in($filter) - 接受一个值数组,这些值必须是元素
- notIn($filter) - "in"方法的否定
- onlyKeys($keys) - 通过键过滤数据
- row_to_column($main_node) - 通过特定键拆分。此键成为主要中心
测试数据
protected $students = array( array("name" => "Milan", "surname" => "Gallas", "age" => 20, "Job" => "php Programátor"), array("name" => "Amdrea", "surname" => "Novotná", "age" => 17, "Job" => "java Programátor"), array("name" => "Honza", "surname" => "Pulkert", "age" => 27, "Job" => "c# Programátor"), array("name" => "Nikola", "surname" => "Světnická", "age" => 23, "Job" => "php Programátor"), array("name" => "Nikola", "surname" => "Světnická", "age" => 23, "Job" => "php Programátor"), array("name" => "Petr", "surname" => "Grůdl", "age" => 31, "Job" => "java Programátor"), ); protected $sports = array( array("userName" => "Milan", "sport" => "šachy", "active" => true), array("userName" => "Milan", "sport" => "karate", "active" => false), array("userName" => "Honza", "sport" => "box", "active" => true), array("userName" => "Honza", "sport" => "fotbal", "active" => false), array("userName" => "Milan", "sport" => "hokej", "active" => true), array("userName" => "Petr", "sport" => "tenis", "active" => true) );
使用示例
require 'vendor/autoload.php'; //init base linq class $linq = \Linq\LinqFactory::createLinq(); //filtering data - select only users who are older than 23 $linq ->from($userData) ->where(function($item){ if($item["age"] > 23) return $item; }) //clasic select var_dump($linq->select()); //select data with function var_dump( $linq->select(function($person){ $person["age"]*=2; return $person; }) ); //or var_dump( $linq->select(function($user){ //return $user["name"] //you can try = return string return array("userName" => $user["name"]); //return array }) ); //short select = less typing :D var_dump( $linq->select("age") ); echo '<br>'; var_dump( $linq->select("name", "age") ); echo '<br>'; //$linq->select("name", "age") => var_dump( $linq->select(function($user){ return array($user["name"] => $user["age"]); }) ); //full use with join method and groupBy $linq ->from($userData) //->innerJoin($sportData) ->leftJoin($sportData) ->on(function($user, $sport){ return ($user["name"] == $sport["userName"]); }) ->groupBy("Job") ->select()
class JsonLinq
该类接受JSON格式的数据源。返回数组。
测试数据
$userJsonData = json_encode($userData); $sportJsonData = json_encode($sportData);
使用示例
$linq = \Linq\LinqFactory::createJsonLinq(); echo '<pre>'; var_dump( $linq ->from($userJsonData) ->takeWhile(function($user){ return ($user["Job"] === "php Programátor" && $user["age"] > 20); }) );
class XmlLinq
该类接受JSON格式的数据源。返回数组。
"from"方法接受字符串或SimpleXmlElement。如果您选择字符串形式的xml,则您将处理数组。如果您选择SimpleXmlElement对象的xml,则您将处理标准对象的集合。
测试数据
$sportXml = '<sports> <sport> <userName>Milan</userName> <sport>šachy</sport> <active>true</active> </sport> <sport> <userName>Milan</userName> <sport>karate</sport> <active>false</active> </sport> <sport> <userName>Milan</userName> <sport>hokej</sport> <active>true</active> </sport> <sport> <userName>Honza</userName> <sport>box</sport> <active>true</active> </sport> <sport> <userName>Honza</userName> <sport>fotbal</sport> <active>false</active> </sport> <sport> <userName>Petr</userName> <sport>tenis</sport> <active>true</active> </sport> </sports>'; //users $userXml = ' <students> <student> <name>Milan</name> <surname>Gallas</surname> <age>20</age> <Job>php Programátor</Job> </student> <student> <name>Amdrea</name> <surname>Novotná</surname> <age>17</age> <Job>Java Programátor</Job> </student> <student> <name>Honza</name> <surname>Pulkert</surname> <age>27</age> <Job>c# Programátor</Job> </student> <student> <name>Nikola</name> <surname>Světnická</surname> <age>23</age> <Job>php Programátor</Job> </student> <student> <name>Nikola</name> <surname>Světnická</surname> <age>23</age> <Job>php Programátor</Job> </student> <student> <name>Petr</name> <surname>Grůdl</surname> <age>31</age> <Job>Java Programátor</Job> </student> </students> ';
使用示例
//first example. Source is string echo '<pre>'; var_dump( \Linq\LinqFactory::createXmlLinq() ->from($userXml) ->leftJoin($sportXml) ->on(function($user, $sport){ return ($user["name"] == $sport["userName"]); }) ->select() ); //second example group by and reverse - source is string echo "<pre>"; var_dump( \Linq\LinqFactory::createXmlLinq()->from($userXml)->groupBy("Job", "name")->reverse()->select(); ); echo "</pre>"; //third examlple - source is simpleXmlElement. use condition on collection of objects and sort by orderBy function descending $xmlElemetn = new SimpleXMLElement($userXml); echo '<pre>'; var_dump( \Linq\LinqFactory::createXmlLinq() ->from($xmlElemetn) ->where(function($user){ return (strlen($user->name) > 5); }) ->orderBy("age", true) ->select() );