Extension:Arrays
リリースの状態: 安定 |
|
|---|---|
| 実装 | パーサー関数 |
| 説明 | パーサーに配列関数を追加して拡張する |
| 作者 | Li Ding, Jie Bao, Daniel Werner |
| 最新バージョン | 2.2.1 (2020-12-08) |
| MediaWiki | 1.31+ |
| データベースの変更 | いいえ |
|
|
| ライセンス | MIT ライセンス |
| ダウンロード | README CHANGELOG |
| translatewiki.net で翻訳を利用できる場合は、Arrays 拡張機能の翻訳にご協力ください | |
| 問題点 | 未解決のタスク · バグを報告 |
Arrays拡張機能(以前はArrayExtensionとして知られていた)は、配列を操作する追加のパーサ関数のセットを作成します。
関数
この拡張機能は以下のパーサー関数を定義します:
| グループ | 関数 |
|---|---|
| 配列を作成する(ユニーク、ソート、プリントオプション付き)。 | #arraydefine
|
| 配列から情報を取り出す | #arrayprint, #arrayindex, #arraysize, #arraysearch, #arraysearcharray, #arrayslice
|
| 配列を変更 | #arrayreset, #arrayunique, #arraysort
|
| 複数の配列の相互作用 | #arraymerge, #arrayunion, #arrayintersect, #arraydiff
|
| Extension:HashTablesがインストールされている場合、配列/ハッシュテーブルの相互作用のために | #hashtoarray, #arraytohash
|
配列の構築
arraydefine
この関数は、「区切り」で区切られた「値」(values) のリストを用いて、「キー」で識別される配列を構築します。 この変数は、後で他の関数からアクセスできます。
構文:
{{#arraydefine:キー | 値 | 区切り | オプション}}
注記:
- 「値」(values) は「区切り」で区切られた文字列のリストです。
- 結果として得られる配列は、文字列の配列となります。
- 区切り (delimiter) は、指定されなければ
,です。区切りは、文字列 (区切りを囲む空白は切り取られます) または、例えば/\s*,\s*/(preg_split 参照) のような Perl 正規表現が使用できます。 - 利用者は空の配列を定義できます (例参照)。
- 利用者は、ユニーク、ソート、プリントなどのオプションを指定できます (例参照)。
- オプションは区切りも指定されない限り無視されます。
例:
a という名前の1要素配列を定義します
|
{{#arraydefine:a|red}}
|
4要素の配列 b を定義し、既定の区切り (,) を使用します
|
{{#arraydefine:b|orange, red, yellow, yellow}}
|
空の配列 c を定義/設定します
|
{{#arraydefine:c}}
|
2 つの要素を持つ配列 d を ; を区切りとして定義します
|
{{#arraydefine:d|apple; pear|;}}
|
正規表現 /\s*[;,]\s*/ を区切り文字として、e という名前の 3 要素からなる配列を定義します
|
{{#arraydefine:e|apple, pear; orange|/\s*[;,]\s*/}}
|
Define a three-element array named f, use delimiter (,), "unique, sort=desc, print=list" options (the array elements are unique, sorted in descending order and being printed). ソートのその他のオプション値については、#arraysortを参照してください。
|
{{#arraydefine:f|orange, red, yellow, yellow |, |unique, sort=desc, print=list}}
|
配列の操作
抽出
arrayprint
この関数は、配列の値をカスタマイズ可能なフォーマットで表示します。
構文:
{{#arrayprint:key|delimiter|pattern|subject|options}}
注記:
- subject は、ウィキのリンク、テンプレート、パーサー関数を受け付けます。
- subject の中では、パイプ文字
|をエスケープする必要はありません。 全体の構成の中で、patternは検索され、各ループの現在の(エスケープされた)配列の値に置き換えられます。 最後に、文字列全体が解析され、delimiterをセパレータとして暗算された結果の配列に入れられる。 - 表示すべき配列が存在しない場合、空文字列を返します (1.4 alpha で導入された、互換モードの一部)。
- 既定の区切り文字は言語に依存し、英語の場合は
,です (2.0 で導入され、互換モードの一部となりました)。
例:
| タスク | コード例 | Output (the array b is defined above) |
|---|---|---|
| プリント - 言語に依存する既定のリスト区切りを使用する | {{#arrayprint:b}}
|
|
| プリント - 区切りなし | {{#arrayprint:b | }}
|
|
プリント - 区切り記号として <br /> (改行) を使用します
|
{{#arrayprint:b |<br/> }}
|
orange
red yellow yellow |
最後の 2 つの要素が and (あるいはそれに相当する現地語) で連結されたきれいなリスト出力です。 たとえ delimiter パラメーターが空でも、, (または各言語の同等のもの) が使用されます。
|
{{#arrayprint:b ||@ |@ |print=pretty }}
|
|
| カテゴリへのウィキ リンクの埋め込み | {{#arrayprint:b |<br/> |@@@@ |[[:Category:@@@@|@@@@]] }}
|
orange |
| セマンティックなMediaWikiのプロパティ値を定義する | {{#arrayprint:b |<br/> |@@@@ |[[prop1::@@@@]] }}
|
|
| パーサー機能の埋め込み | {{#arrayprint:b |<br/> |@@@@ |length of @@@@:{{#len:@@@@}} }}
|
|
| テンプレート(パラメータ付き)を埋め込む | {{#arrayprint:b|<br/>|@@@@|{{template|prop2|@@@@}} }}
|
arrayindex
この関数は、配列(keyで識別)の値を位置 index に表示します。
構文:
{{#arrayindex:key|index|default}}
注記:
- 無効なインデックス(非数値、境界外)は、空文字列を表示します。
- インデックスは 0 ベース、つまり最初の要素のインデックスは 0 です。
- 負のインデックスは、末尾から遠い要素を返します (例えば、
-1は配列の最後の要素になります)。 - 配列が存在しない場合、配列内にキーが存在しない場合、 値が空文字列の場合は default が返されます。
例:
| 配列の3番目の要素a | {{#arrayindex:a |2 }}
|
| 配列の最後の要素b | {{#arrayindex:b |-1 }}
|
| 無効なインデックスに対する既定値を出力する | {{#arrayindex:c |foo |bad value }}
|
arraysize
この関数は、配列のサイズ(要素数)を返します。
https://php.net/function.count を参照 与えられた配列が存在しない場合、この関数の出力は数値ではなく空文字列になります。 これにより、配列が存在するかどうかを確認することができます。
構文:
{{#arraysize:key}}
例:
| 配列のサイズ a: | {{#arraysize:a}}
|
| 配列aが存在するかどうかをチェックします。 | {{#if: {{#arraysize:a}} | ''配列存在'' | ''配列非定義'' }}
|
arraysearch
この関数は、index パラメーターで指定した位置から key パラメーターで指定した配列の中で value が最初に現れるインデックスを返し、失敗した場合は空文字列を返す。
yes および/または no が指定された場合、yes に設定された値が見つかれば展開し、そうでなければ no の値を展開する。
https://php.net/function.array-search を参照
構文:
{{#arraysearch:key|value|index|yes|no}}
例:
| 値が最初に出現するインデックスを返す | {{#arraysearch:b|white}}
{{#arraysearch:b|red}}
使用量
{{#arraysearch:b|red|0}}
{{#arraysearch:b|red|2}}
preg正規表現一致を使用する
{{#arraysearch:b|/low/}}
{{#arraysearch:b|/LOW/i}} - 大文字小文字を区別しません
{{#arraysearch:b|low}}
はいいいえプリントオプションの使用
{{#arraysearch:b|white|0|yes|no}}
{{#arraysearch:b|yellow|0|yes|no}}
|
arraysearcharray
この関数は、(keyで識別される)配列を検索し、すべての検索結果を含む(new_keyで識別される)新しい配列を作成します。 検索条件valueには、文字列または正規表現を指定することができる。 もしindexが与えられれば、検索はそこから始まり、limitは検索結果の最大値を定義することができる。 value が正規表現である場合、transform で識別されるパラメータを使用することができる。 一致したエントリの結果をPHP preg_replaceが行うようにnew_key配列に変換できます。
構文:
{{#arraysearcharray:new_key|key|value|index|limit|transform}}
注記:
- value が文字列の場合、new_key 配列はこの文字列と完全に一致する項目のみを含みます。
-nのような負の index 値は、最後の n 項目のみを検索するために使用することができます。- Extension:Regex Funがウィキ内で利用可能であれば、Regex Funのe修飾子がregex内で利用できます。 これはPHPのe修飾子とは関係ありません(セキュリティ違反になります)。 アクティブなe修飾子を使うと、バックリファレンスが挿入された後、transform文字列が解析され、その後、実際のマッチを置き換えます。
例:
配列 a から、A の後にスペースが続く項目を全て探し、新しい配列 x に入れる。
|
{{#arraysearcharray:x |a |/^A\s.+/ }}
|
配列 a の末尾が数字であるエントリをすべて検索し、数字のみを新しい配列 y に格納する。
|
{{#arraysearcharray:y |a |/^.*?(\d+)$/ |0 |-1 | $1 }}
|
配列 a の末尾が数字である項目をすべて検索し、その長さを新しい配列に入れます (これには Regex Fun の拡張が必要です)。
|
{{#arraysearcharray:y |y |/^.*?\d+$/e |0 |-1 | {{#len:$0}} }}
|
配列 a から空の値を削除します。
|
{{#arraysearcharray:a|a|/\S+/}}
|
arrayslice
この関数は、配列(key で指定)から部分配列を取り出し、新しい配列(new_key で指定)に格納します。
https://php.net/function.array-slice を参照
構文:
{{#arrayslice:new_key|key|offset|length}}
注記:
- オフセットはスライスの開始位置を示し、負でない数値、または後方インデックスを示す負の数値(例:配列の最後の要素のオフセットは -1)である。 オフセットがインデックスと異なる(非負の数値でなければならない)。
- Lengthは抽出する要素の数を示す。 省略した場合は、offset から配列の最後までを持つことになる。
- offset が配列のサイズより小さくない場合は空の配列が返され、offset が配列の負のサイズより大きくない場合は、すべての要素を含む新しい配列が返されます。
例:
| オフセット1の要素から始まる2要素のスライスを抽出する。 | {{#arrayslice:x|b|1|2}}
|
| オフセット-2の要素から始まる2要素のスライスを抽出する。 | {{#arrayslice:x|b|-2|2}}
|
変更点
新しい配列を作成する代わりに、配列を直接変更する関数です。
arrayunique
この関数は、配列 (キーで識別) を集合 (重複しない、空要素なし) に変換します。
https://php.net/function.array-unique を参照
構文:
{{#arrayunique:key}}
例:
| 配列をセットに変換する。 | {{#arrayunique:b}}
|
arrayreset
この関数は、定義された配列の一部または全部を解除する。
構文:
{{#arrayreset:}} <!-- すべての配列を解除します。 -->
{{#arrayreset:key1 |key2 |... |key-n }}
注記:
- これらにarraysizeを使うと、
0の代わりに空の文字列が返されるので、実際には空ではなく未設定です。 配列を単純に空にするには、{{#arraydefine:key}}を使用します。 - バージョン 1.4 より前のアルファベット
,は、設定されていないはずの複数の配列を区切るために使用されます。
arraysort
この関数は、配列を次の順序でソートする。
none- 並べ替えなし (既定)desc- 降順に表示(https://php.net/function.sort参照)asce/asc- 昇順に表示(https://php.net/function.rsort参照)random- 順不同で表示(https://php.net/function.array-rand参照)reverse- 逆順に表示(https://php.net/function.array-reverse参照)
構文:
{{#arraysort:key|order}}
注:
- 配列の各要素は文字列として扱われるため、数値が期待通りに並ばない可能性があります。
例:
| 配列をソートします。 | {{#arraysort:x|desc}}
|
| 配列をランダム化する。 | {{#arraysort:x|random}}
|
| 配列を反転させる。 | {{#arraysort:x|reverse}}
|
相互作用
複数の配列を処理し、結果として新しい配列を作成したり、既存の配列を上書きしたりする関数です。 バージョン2.0以降、これらの関数は一度に2つ以上の配列を扱うことができるようになりました。 1つの配列しか扱わない場合は、その配列のコピーを作成するだけです。 存在しない配列は、これらの関数では単に無視されます。
arraymerge
この関数は、2つ以上の配列の値を新しい配列(new_keyで識別)に結合します。
https://php.net/function.array-merge を参照
構文:
{{#arraymerge:new_key |key1 |key2 |... |key-n }}
例:
| 2つの配列を結合します。 | {{#arraymerge:x |a |b }}
|
| 配列を複製する(arraymergeの第3引数は空にしておく)。 | {{#arraymerge:x |b }}
|
arrayunion
この関数は、2つ以上の配列の値を、重複のない新しい配列(new_key で識別)にマージします。
構文:
{{#arrayunion:new_key |key1 |key2 |... |key-n }}
注記:
- これは集合演算子であり、返される配列は重複した値を持たない集合である。
- これは、arraymergeをarrayuniqueで後払いするのと同じことです。
例:
| 3つの配列の連合体。 | {{#arrayunion:x |a |b |c }}
|
arraydiff
この関数は,2つ以上の配列の(集合論的)差を計算する。 結果配列はnew_keyで識別される。 返される配列は、最初に指定された配列(key1 で識別)の要素で、他のどの配列にも定義されていないものを含む集合である。 https://php.net/function.array-diff を参照
構文:
{{#arraydiff:new_key |key1 |key2 |... |key-n }}
注:
- これは集合演算子であり、返される配列は重複する値を含まない集合となります。
- この関数は、サブクラス関係をテストするために使用することができます。
例:
| 差分 (b-a) | {{#arraydiff:x |b |a }}
|
| 差分 (a-b) | {{#arraydiff:x |a |b }}
|
| 差分 (a-(b+c)) | {{#arraydiff:x |a |b |c }}
|
arrayintersect
この関数は,2つ以上の配列の集合論的な交点を計算する。 結果配列はnew_keyで識別される。 https://php.net/function.array-intersect を参照
構文:
{{#arrayintersect:new_key |key1 |key2 |... |key-n }}
注:
- これは集合演算子であり、返される配列は重複した値を持たない集合である。
例:
| 3 つの配列の交点を新しい配列に格納 x | {{#arrayintersect:x |a |b |c }}
|
インストール
- ダウンロードして、ファイルを
extensions/フォルダー内のArraysという名前のディレクトリ内に配置します。
開発者とコード寄稿者は、上記の代わりに以下を使用してGitからインストールします:cd extensions/ git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Arrays
- 以下のコードを LocalSettings.php ファイルの末尾に追加します:
wfLoadExtension( 'Arrays' );
- 必要に応じて設定します。
完了 – ウィキの「Special:Version」に移動して、拡張機能が正しくインストールされたことを確認します。
設定
Arrays2.0では、2つの設定変数が導入されています。
- $egArraysCompatibilityMode
- (1.4 alphaでは$egArrayExtensionCompatbilityMode)trueに設定すると、互換モードが有効になり、古い ArrayExtension 1.3.2の挙動を可能な限り復活させます。 これは、Version 2.0において、いくつかの破壊的な変更が導入されたためです。 そのため、この互換モードを使用することで、1.x から 2.x の Arrays 拡張機能への切り替えがスムーズに行えます。 既定では、互換モードは非アクティブです。 もし、以前にあなたのウィキ内で古いArrayExtensionを使用していたならば、互換性モードなしでArraysに切り替える前に、そのリストを見て、テンプレートを調整した方がいいかもしれません。
- $egArraysExpansionEscapeTemplates
- テンプレートまたはパーサーの関数呼び出しによって、#arrayprint に含まれる配列値内で置換されるべき文字のキーと値のペアのリストが含まれています。 これらの特殊文字を置換してから値を展開することで、配列の値が周囲のMWコードに影響を与えることがなくなります。 そうでなければ、配列の値自体も解析されてしまいます。既定では、これは以下のテンプレートやパーサーの関数呼び出しで、以下の文字をエスケープします。
=={{=}}("Template:=" は=と表示されるはずです)|={{!}}("Template:!" は|と表示されるはずです)
注: MW 1.24.0から、"Template:!"は新しいマジックワードである{{!}}で目的を果たすため、作成する必要がなくなりました。
{{={{((}}("Template:((" は{{と表示されるはずです)}}={{))}}("Template:))" は}}と表示されるはずです)
- これらのテンプレートやパーサー関数があなたのウィキに存在することを確認するか、この変数を適宜変更してください。 この設定を誤ると、配列の値でこれらの文字列のいずれかを使用している場合、
#arrayprintが予期しない値を表示することがあります。 - $egArraysExpansionEscapeTemplatesは単純にnullに設定することもできます。この場合、2.0以前の動作に戻り、これらの文字列を含む配列の値は、
#arrayprintの中で与えられたsubjectのコードを破ることになります。 互換モードが有効な場合は、常にnullに設定されているものとして扱われます。
よくある質問
配列要素への繰り返しアクセス
配列の要素に#arrayprintやExtension:Loopsを用いて繰り返しアクセスすることが可能である。
arrayprintを使用
<!-- 配列を定義する -->
{{#arraydefine:colors|Red,Blue,Yellow}}
{{#arrayprint:colors||@@@@|<nowiki/>
* @@@@の長さ: {{#len:@@@@}}
}}
以下は、期待される出力です。
|
その他の例は、旧テザーレス・ワールドウィキで見ることができます。
キーの再利用
一度定義した配列をプリントすれば、同じキーをさらに下の階層の配列に再利用することができます。この順序を守る限り、すべてのアレイに一意のキーを定義する必要はありません。
ループ拡張機能の使用
より複雑なタスクのために、Loops拡張機能を使って配列の中をループすることが可能である。
{{ #arraydefine: colors | red;#FF0000, green;#00FF00, blue;#0000FF }}
{{
#loop: i
| 0 <!-- ループの開始値を{{ #var:i }}にする -->
| {{ #arraysize:colors }} <!-- ループ数 -->
| <nowiki/>
* {{
#arraydefine: val | {{ #arrayindex:colors | {{ #var:i }} }} | ;
}}
<span style="color:{{ #arrayindex: val | 1 }}">
{{ #arrayindex: val | 0 }}
</span>
}}
次のようなものを出力します:
- red
- green
- blue
配列にセマンティックデータを入力する方法は2つあります。 最初のソリューションであるセマンティックリザルトフォーマットは、より高速で信頼性が高く、レコードデータや1つのプロパティに対する複数の値を含む複雑なデータセットにも対応しています。
Semantic Result Formats (SRF) は、バージョン 1.6.1 で Array フォーマットを導入しました。 これは、自動的に Extension:Arrays 配列に格納されるデータを問い合わせるために使用することができます。 これは、配列内のセマンティックデータを扱うのに好ましいソリューションです。 詳細はsemantic-mediawiki.orgで確認できます。
例:
{{#ask: [[Category:Color]][[:+]] |format=array |name=colors}}
{{#arrayprint: colors}}
標準クエリの使用
上記の SRF ソリューションを使用できない場合、配列では、リスト 形式の SMW クエリの結果を使用して配列を生成することもできます。
例 A: クラス Color のインスタンスのリストを作成するには
{{#arraydefine:colors|{{#ask:[[Category:Color]][[:+]] |sep =, |limit=1000}} }}
例 B: プロパティ has color の値の一意なリストを作成するには
{{#arraydefine:colors|{{#ask:[[has color::+]][[:+]] |?color= |mainlabel=- |sep =, |limit=1000}} |,|unique}}
例 C: SWMクエリで生成される2次元配列(レコード型プロパティなど)に対応するため
given a 2D array "red;#da2021, yellow;#fcff00, green;#00ff00"
1. 配列 <code>colors</code> を作成する
{{#arraydefine:colors|red;#da2021, yellow;#fcff00, green;#00ff00}}
2. <code>colors</code> の最初の要素を別の配列 <code>colors0</code> に分割する
{{#arraydefine:color0|{{#arrayindex:colors|0}}|;}}
注記:
- セマンティッククエリパラメータ
limit=1000オプションは、セマンティッククエリの返された結果をすべて使い切るために使用されます。sep=,オプションは、結果のエントリのセパレータを設定するために使用されます。- ページカラムを切り取る
mainlabel=-オプション
SMW の場合と同様に、Arrays 拡張機能を使用して 'DPL query の結果を保存することができます。 結果リストを反転を反転できます。 特定のページが特定のテンプレートを含むときに使用されるすべてのパラメータ値を収集します。 テンプレートパラメータ値 と ページ名 のペアを保存します。 そして、配列をソートしてペアを表示します。 連続した配列要素の最初の部分が同じ(つまりパラメータ値が同じ)場合、最初の部分は一度だけ表示されます。 このように、単純な転置インデックスを構成することができる。 同じ仕組みは、他の問題にも応用できるはずだ。
関連項目
- Extension:HashTables - MediaWikiでハッシュテーブルを使用するための非常によく似た拡張機能です。
- Extension:Variables
- Extension:Page Forms - パーサー関数#arraymapを提供します。 入力と出力が同じ関数で処理されるため、キーを定義する必要がなくなります。
- Extension:WSArrays - 多次元配列や連想配列を操作するためのパーサ関数群を提供します。
- Extension:Scribunto - Scribuntoは、ウィキページにLuaスクリプトを埋め込むことができ、配列と標準的な命令型プログラミング言語の制御フローを提供します。
- Extension:ArrayFunctions - a Parsoid-compatible alternative, that also works with multidimensional and associative arrays.
| この拡張機能は以下のウィキ ファーム/ウィキ ホスト/パッケージに含まれています: |
- Stable extensions/ja
- Parser function extensions/ja
- ParserClearState extensions/ja
- ParserFirstCallInit extensions/ja
- MIT licensed extensions/ja
- Extensions in Wikimedia version control/ja
- All extensions/ja
- Extensions included in BlueSpice/ja
- Extensions included in Canasta/ja
- Extensions included in Fandom/ja
- Extensions included in Miraheze/ja
- Extensions included in ProWiki/ja
- Extensions included in semantic::core/ja
- Extensions included in Telepedia/ja
- Extensions included in wiki.gg/ja
- Array extensions/ja
- Number extensions/ja
- Modifiable variables extensions/ja
