hesa2020/php-linq-fix

快速且现代的数据操作库

维护者

详细信息

github.com/hesa2020/php-linq

源代码

安装: 46

依赖: 0

建议: 0

安全: 0

星标: 0

关注者: 1

分支: 7

1.1 2021-09-06 20:22 UTC

This package is not auto-updated.

Last update: 2024-09-20 12:03:52 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()
	);