JsonQ は、あらゆる種類の JSON データに対してクエリを実行するためのシンプルでエレガントな PHP パッケージです。 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
}
]
*/
クエリ結果の価格の合計を取得したいとします。 get()の代わりにsum()メソッドを呼び出すことで簡単に実行できます。
$ result = $ json -> from ( ' products ' )
-> where ( ' cat ' , ' = ' , 2 )
-> sum ( ' price ' );
dump ( $ result );
//It will print:
/*
365000
*/
かなりきれいですね。
完全な API を探索して、このライブラリが他にどのような魔法を実現できるかを見てみましょう。しましょうか?
ここで指定したサンプル JSON データに基づいて、次の API 例を示します。例をよりよく理解するには、まずその JSON データを参照してください。各 API の詳細な例もここにあります。
APIのリスト:
fetch()
このメソッドはクエリを実行し、結果のデータを返します。いくつかのクエリメソッドを使用した後、最後にそれを呼び出す必要があります。詳細については、他の API の例を参照してください。
find(path)
path
-- 検索するデータのパス階層。この後はfetch()
メソッドを呼び出す必要はありません。このメソッドは独自にデータを取得して返すためです。
注意:その後にさらにクエリ メソッドを連鎖させることはできません。それが必要な場合は、 at()
またはfrom()
メソッドを使用する必要があります。
例:
Json データの「cities」プロパティの値を取得したいとします。次のようにして実行できます。
$ 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
パラメータをスキップするか、 「.」を指定します。 as パラメーターもルート データからクエリを開始します。
このメソッドと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
-- 照合する値。 op
に応じて、 int 、 string 、 bool 、またはFunction の場合もあります。
op
-- マッチングに使用されるオペランド。次のオペランドを使用できます。
=
: 弱い等価一致の場合eq
: =
と同じ!=
: 等価ではない弱い一致の場合neq
: !=
と同じ==
: 厳密な等価一致の場合seq
: ==
と同じ!==
: 厳密な等価一致ではない場合sneq
: !==
と同じ>
: データ内の指定されたキーの値がvalより大きいかどうかを確認しますgt
: >
と同じ<
: データ内の指定されたキーの値がvalより小さいかどうかを確認しますlt
: <
と同じ>=
: データ内の指定されたキーの値がval以上であるかどうかを確認します。gte
: >=
と同じ<=
: データ内の指定されたキーの値がval以下であるかどうかを確認します。lte
: <=
と同じnull
: data 内の指定されたキーの値がnullかどうかを確認します (このop
ではwhere()
のval
パラメーターを省略できます)notnull
: data 内の指定されたキーの値がnull でないかどうかを確認します (このop
ではwhere()
のval
パラメーターを省略できます)in
: data の指定されたキーの値が指定されたvalに存在するかどうかを確認します。 val はプレーンなArrayである必要があります。notin
: data 内の指定されたキーの値が指定されたvalに存在しないかどうかを確認します。 val はプレーンなArrayである必要があります。startswith
: データ内の指定されたキーの値が、指定されたvalで始まるかどうか (プレフィックスが付いているかどうか) を確認します。これは文字列型のデータに対してのみ機能します。endswith
: データ内の指定されたキーの値が指定されたvalで終わるかどうか (接尾辞が付いているかどうか) を確認します。これは文字列型のデータに対してのみ機能します。contains
: data 内の指定されたキーの値に指定されたvalの部分文字列があるかどうかを確認します。これは文字列型のデータに対してのみ機能します。match
: データ内の指定されたキーの値が、指定されたvalと一致する正規表現を持っているかどうかを確認します。 val
パラメータは、このop
のRegExpである必要があります。macro
: 指定されたval
を実行するデータ内の指定されたキーの値との一致を試みます。 val
パラメータは、このop
の関数である必要があります。この関数は内部に一致するロジックを持ち、それに基づいて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()
メソッドで指定された条件は、結果と他の条件の OR 演算を行うことです。
たとえば、 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'プロパティをスキップすると、データはデフォルトで昇順に並べられます。データを降順に並べ替えるには、 「order」パラメータとして「desc」を渡す必要があります。また、 「order」パラメーターで比較関数を渡して、データを並べ替える独自のロジックを定義することもできます。注:このメソッドはプレーンな配列に使用する必要があります。オブジェクトの配列を並べ替える場合は、後で説明するsortBy()メソッドを使用する必要があります。
例:
「arr」データを並べ替えたいとします。次のように行うことができます:
$ q = new Jsonq ();
$ res = $ q -> collect ([ 7 , 5 , 9 , 1 , 3 ])
-> sort ();
詳細な例はこちらをご覧ください。
sortBy(column, order)
column
-- 並べ替えが行われる列名を渡す必要があります。order
-- 'order'プロパティをスキップすると、データはデフォルトで昇順に並べられます。データを降順に並べ替えるには、 「order」パラメータとして「desc」を渡す必要があります。また、 「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] までメールを送ってください。
このパッケージにはさまざまな言語もサポートされています。
おい、おい!いくつか手伝ってください!