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。
該軟體包還支援不同的語言。
嘿夥計!幫我幾個吧!