JsonQ是一个简单、优雅的 PHP 包,用于查询任何类型的 JSON 数据。它通过在 JSON 上提供类似 ORM 的查询风格,让您的生活变得更轻松。
嘿,到期了,请帮助我日常改进这个项目
从 JsonQ 6.0 版本开始,所有功能均重写自 QAarray。经过长时间的运行,我们发现 JsonQ 的查询引擎应该是独立的。因为人们想要查询各种类型的数据,例如 CSV、YAML、XML。因此,如果我们将查询引擎与该项目紧密结合,那么它就没有意义。这就是我们移动查询引擎部分并开发新包 QAarray 的原因。 Qarray 专为通过本机 PHP 数组进行查询而设计,任何人都可以实现自己的引擎,例如 JsonQ。
请不要直接从下面更新到 >= 6.0 版本
composer require nahid/jsonq
您可以通过从文件导入 JSON 数据来立即开始使用此包:
use Nahid /JsonQ/Jsonq;
$ jsonq = new Jsonq ( ' data.json ' );
或者来自 JSON 字符串:
$ json -> json ( ' {"id": 1, "name": "Nahid"} ' );
或者来自 PHP 数组:
$ json -> collect ([ ' id ' => 1 , ' name ' => ' Nahid ' ]);
您可以使用各种查询方法开始查询数据,例如find 、 where 、 orWhere 、 whereIn 、 whereStartsWith 、 whereEndsWith 、 whereContains等。您还可以在查询后使用sum 、 count 、 groupBy 、 max 、 min等聚合数据。
让我们看一个简单的例子:
//data.json
{
"name" : " products " ,
"description" : " Features product list " ,
"vendor" :{
"name" : " Computer Source BD " ,
"email" : " [email protected] " ,
"website" : " www.example.com "
},
"users" :[
{ "id" : 1 , "name" : " Johura Akter Sumi " , "location" : " Barisal " },
{ "id" : 2 , "name" : " Mehedi Hasan Nahid " , "location" : " Barisal " },
{ "id" : 3 , "name" : " Ariful Islam " , "location" : " Barisal " },
{ "id" : 4 , "name" : " Suhel Ahmed " , "location" : " Sylhet " },
{ "id" : 5 , "name" : " Firoz Serniabat " , "location" : " Gournodi " },
{ "id" : 6 , "name" : " Musa Jewel " , "location" : " Barisal " , "visits" : [
{ "name" : " Sylhet " , "year" : 2011 },
{ "name" : " Cox's Bazar " , "year" : 2012 },
{ "name" : " Bandarbar " , "year" : 2014 }
]}
],
"products" : [
{ "id" : 1 , "user_id" : 2 , "city" : " bsl " , "name" : " iPhone " , "cat" : 1 , "price" : 80000 },
{ "id" : 2 , "user_id" : 2 , "city" : null , "name" : " macbook pro " , "cat" : 2 , "price" : 150000 },
{ "id" : 3 , "user_id" : 2 , "city" : " dhk " , "name" : " Redmi 3S Prime " , "cat" : 1 , "price" : 12000 },
{ "id" : 4 , "user_id" : 1 , "city" : null , "name" : " Redmi 4X " , "cat" : 1 , "price" : 15000 },
{ "id" : 5 , "user_id" : 1 , "city" : " bsl " , "name" : " macbook air " , "cat" : 2 , "price" : 110000 },
{ "id" : 6 , "user_id" : 2 , "city" : null , "name" : " macbook air 1 " , "cat" : 2 , "price" : 81000 }
]
}
use Nahid JsonQ Jsonq ;
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 2 )
-> get ();
dump ( $ res );
//This will print
/*
array:3 [▼
1 => {#7 ▼
+"id": 2
+"user_id": 2
+"city": null
+"name": "macbook pro"
+"cat": 2
+"price": 150000
}
4 => {#8 ▼
+"id": 5
+"user_id": 1
+"city": "bsl"
+"name": "macbook air"
+"cat": 2
+"price": 110000
}
5 => {#9 ▼
+"id": 6
+"user_id": 2
+"city": null
+"name": "macbook air 1"
+"cat": 2
+"price": 81000
}
]
*/
假设我们想要获得查询结果的价格总和。我们可以通过调用sum()方法而不是get()轻松完成此操作:
$ result = $ json -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 2 )
-> sum ( ' price ' );
dump ( $ result );
//It will print:
/*
365000
*/
很整洁,是吧?
让我们探索完整的 API,看看这个库还能为您做些什么。我们可以?
以下 API 示例基于此处给出的示例 JSON 数据显示。要更好地了解示例,请首先查看 JSON 数据。还可以在此处找到每个 API 的详细示例。
API列表:
fetch()
该方法将执行查询并返回结果数据。使用一些查询方法后最后需要调用它。详细信息可以在其他 API 示例中找到。
find(path)
path
——要查找的数据的路径层次结构。此后您不需要调用fetch()
方法。因为这个方法会自己获取并返回数据。
警告:您不能在其后链接更多查询方法。如果您需要,您应该使用at()
或from()
方法。
例子:
假设您想要获取 Json 数据的“城市”属性的值。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> find ( ' vendor.name ' );
如果你想遍历到更深层的层次结构,你可以这样做:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> find ( ' vendor.name ' );
请参阅此处的详细示例。
from(path)
path
(可选)——要从中开始查询的数据的路径层次结构。默认情况下,查询将从您提供的 JSON 数据的根开始。如果您想首先移动到要开始查询的数据的嵌套路径层次结构,则可以使用此方法。跳过path
参数或给出“.”作为参数也会从根数据开始查询。
该方法与find()
的区别在于, find()
方法将从给定的路径层次结构中返回数据。另一方面,此方法将返回 Object 实例,以便您可以在其后面进一步链接查询方法。
例子:
假设您想要开始查询 JSON 数据的“vendor.name”属性的值。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> from ( ' vendor.name ' )-> get ();
如果你想遍历到更深层的层次结构,你可以这样做:
$ q = new Jsonq ( ' data.json ' );
echo $ q -> from ( ' users.5.visits ' )-> get ();
请参阅此处的详细示例。
at(path)
这是from()
的别名方法,其行为与此完全相同。请参阅此处的示例。
where(key, condition, val)
key
数据的属性名称。或者您可以在此处传递一个函数来对其中的多个查询进行分组。请参阅示例中的详细信息
val
要匹配的值。它可以是int 、 string 、 bool甚至Function - 取决于op
。
op
用于匹配的操作数。可以使用以下操作数:
=
:用于弱相等匹配eq
: 与=
相同!=
: 对于弱不等式匹配neq
: 与!=
相同==
:用于严格相等匹配seq
:与==
相同!==
:用于严格不相等匹配sneq
: 与!==
相同>
:检查数据中给定键的值是否大于valgt
: 与>
相同<
:检查数据中给定键的值是否小于vallt
: 与<
相同>=
:检查数据中给定键的值是否大于或等于valgte
: 与>=
相同<=
:检查数据中给定键的值是否小于或等于vallte
:与<=
相同null
:检查 data 中给定key的值是否为null (此op
可以省略where()
中的val
参数)notnull
:检查 data 中给定key的值是否不为 null (此op
可以省略where()
中的val
参数)in
:检查 data 中给定key的值是否存在于给定val中。 val应该是一个普通的Array 。notin
:检查 data 中给定key的值是否在给定val中不存在。 val应该是一个普通的Array 。startswith
:检查 data 中给定key的值是否以给定val开头(具有前缀)。这只适用于字符串类型数据。endswith
:检查 data 中给定key的值是否以给定val结尾(具有后缀)。这只适用于字符串类型数据。contains
:检查 data 中给定key的值是否包含给定val的子字符串。这只适用于字符串类型数据。match
:检查 data 中给定key的值是否与给定val具有正则表达式匹配。 val
参数应该是该op
的RegExp 。macro
:它将尝试匹配执行给定val
的数据中给定key的值。 val
参数应该是该op
的Function 。该函数内部应该有一个匹配逻辑,并根据该逻辑返回true或false 。例子:
假设您想要查找id
为1
的“用户” 。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )-> where ( ' id ' , ' = ' , 1 )-> get ();
您可以添加多个where条件。它将通过这些多个 where 条件之间的 AND 运算给出结果。
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> where ( ' location ' , ' = ' , ' barisal ' )
-> get ();
请参阅此处的详细示例。
orWhere(key, op, val)
orWhere()
的参数与where()
相同。 where()
和orWhere()
之间的唯一区别是: orWhere()
方法给出的条件会将结果与其他条件进行“或”运算。
例如,如果你想查找id为1
或2
的用户,你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> where ( ' id ' , ' = ' , 1 )
-> orWhere ( ' id ' , ' = ' , 2 )
-> get ();
请参阅此处的详细示例。
whereIn(key, val)
key
-- 数据的属性名称val
它应该是一个数组此方法的行为类似于where(key, 'in', val)
方法调用。
whereNotIn(key, val)
key
-- 数据的属性名称val
它应该是一个数组此方法的行为类似于where(key, 'notin', val)
方法调用。
whereNull(key)
key
-- 数据的属性名称此方法的行为类似于where(key, 'null')
或where(key, '=', null)
方法调用。
whereNotNull(key)
key
-- 数据的属性名称此方法的行为类似于where(key, 'notnull')
或where(key, '!=', null)
方法调用。
whereStartsWith(key, val)
key
-- 数据的属性名称val
它应该是一个字符串此方法的行为类似于where(key, 'startswith', val)
方法调用。
whereEndsWith(key, val)
key
-- 数据的属性名称val
它应该是一个字符串此方法的行为类似于where(key, 'endswith', val)
方法调用。
whereContains(key, val)
key
-- 数据的属性名称val
它应该是一个字符串此方法的行为类似于where(key, 'contains', val)
方法调用。
sum(column)
column
-- 数据的属性名称例子:
假设您想要查找“产品”的“价格”总和。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> sum ( ' price ' );
如果您聚合的数据是普通数组,则不需要传递“column”参数。请参阅此处的详细示例
count()
它将返回集合中元素的数量。
例子:
假设您想要查找“products”属性中有多少个元素。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> count ();
请参阅此处的详细示例。
size()
这是count()
的别名方法。
max(column)
column
-- 数据的属性名称例子:
假设您想找到“产品”的“价格”最大值。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
->max('price);
如果您查询的数据是普通数组,则不需要传递“column”参数。请参阅此处的详细示例
min(column)
column
-- 数据的属性名称例子:
假设您想找到“产品”的“价格”的最小值。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> min ( ' price ' );
如果您查询的数据是普通数组,则不需要传递“property”参数。请参阅此处的详细示例
avg(column)
column
-- 数据的属性名称例子:
假设您想要找到“产品”的“价格”的平均值。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> avg ( ' price ' );
如果您查询的数据是普通数组,则不需要传递“column”参数。请参阅此处的详细示例
first()
它将返回集合的第一个元素。
例子:
$ q = new jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> first ();
请参阅此处的详细示例。
last()
它将返回集合的最后一个元素。
例子:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> last ();
请参阅此处的详细示例。
nth(index)
index
-- 要返回的元素的索引。它将返回集合的第 n 个元素。如果给定的索引是正值,它将返回从开头算起的第 n 个元素。如果给定的索引为负值,则返回倒数第 n 个元素。
例子:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> nth ( 2 );
请参阅此处的详细示例。
exists()
如果元素不为空、不为null 、不为空数组或不为空对象,则返回true 。
例子:
假设您想要查找“products”属性中有多少个元素。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> exists ();
请参阅此处的详细示例。
groupBy(column)
column
——要根据其对集合进行分组的属性。例子:
假设您想根据“位置”属性对“用户”数据进行分组。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' users ' )
-> groupBy ( ' location ' )
-> get ();
请参阅此处的详细示例。
sort(order)
order
- 如果跳过'order'属性,数据将默认按升序排序。您需要传递“desc”作为“order”参数以按降序对数据进行排序。此外,您可以在“order”参数中传递比较函数来定义您自己的逻辑来对数据进行排序。注意:此方法应该用于纯数组。如果你想对对象数组进行排序,你应该使用稍后描述的sortBy()方法。
例子:
假设您想要对“arr”数据进行排序。你可以这样做:
$ q = new Jsonq ();
$ res = $ q -> collect ([ 7 , 5 , 9 , 1 , 3 ])
-> sort ();
请参阅此处的详细示例。
sortBy(column, order)
column
——您需要传递要进行排序的列名称。order
- 如果跳过'order'属性,数据将默认按升序排序。您需要传递“desc”作为“order”参数以按降序对数据进行排序。此外,您可以在“order”参数中传递比较函数来定义您自己的逻辑来对数据进行排序。注意:此方法应用于对象数组。如果你想对普通数组进行排序,你应该使用前面描述的sort()方法。
例子:
假设您想要对'products'的'price'数据进行排序。你可以这样做:
$ q = new Jsonq ( ' data.json ' );
$ res = $ q -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 1 )
-> sortBy ( ' price ' , ' desc ' );
请参阅此处的详细示例。
reset(data)
data
可以是 JSON 文件路径、JSON 字符串或 JSON 对象。如果data
参数中没有传递任何数据,则jsonQ
对象实例将重置为之前初始化的数据。在任何时候,您可能希望将对象实例重置为完全不同的数据集,然后对其进行查询。在这种情况下您可以使用此方法。
请参阅此处的详细示例。
copy()
它将返回对象实例的完整克隆。
请参阅此处的详细示例。
如果您遇到任何错误或问题,请随时在 github 上提出问题。
另外,您可以向我发送电子邮件至 mailto:[email protected] 以寻求拥抱或 bug。
该软件包还支持不同的语言。
嘿伙计!帮我几个吧!