Extension:Arrays

From mediawiki.org
This page is a translated version of the page Extension:Arrays and the translation is 99% complete.
警告 警告: この拡張機能は、Parsoid の使用によって意図されているように、構文解析を並列化する計画と互換性がありません。 従って、この拡張機能の将来は不確かであり、数年内には標準の MediaWiki パーサーと互換性がなくなると予想されています。 詳細情報は、タスク T250963 および Parsoid/拡張機能 API#拡張機能タグを順次、順番に処理するためのサポートがありません を参照してください。
MediaWiki 拡張機能マニュアル
Arrays
リリースの状態: 安定
実装 パーサー関数
説明 パーサーに配列関数を追加して拡張する
作者 Li Ding, Jie Bao, Daniel Werner
最新バージョン 2.2.1 (2020-12-08)
MediaWiki 1.31+
データベースの変更 いいえ
ライセンス MIT ライセンス
ダウンロード
README
CHANGELOG
  • $wgArraysCompatibilityMode
  • $wgArraysExpansionEscapeTemplates
Quarterly downloads 39 (Ranked 110th)
translatewiki.net で翻訳を利用できる場合は、Arrays 拡張機能の翻訳にご協力ください
問題点 未解決のタスク · バグを報告

Arrays拡張機能(以前はArrayExtensionとして知られていた)は、配列を操作する追加のパーサ関数のセットを作成します。

関数

この拡張機能は以下のパーサー関数を定義します:

グループ 関数
配列を作成する(ユニーク、ソート、プリントオプション付き)。 #arraydefine
配列から情報を取り出す #arrayprint, #arrayindex, #arraysize, #arraysearch, #arraysearcharray, #arrayslice
配列を変更 #arrayreset, #arrayunique, #arraysort
複数のアレイの相互作用 #arraymerge, #arrayunion, #arrayintersect, #arraydiff
Extension:HashTables がインストールされている場合、配列/ハッシュテーブルの相互作用のために #hashtoarray , #arraytohash

配列の構築

arraydefine

この関数は、'delimiter' で区切られた 'values' のリストを用いて、'key' で識別される配列を構築する。 この変数は、後で他の関数からアクセスすることができます。

構文:

{{#arraydefine:key|values|delimiter|options}}

注記:

  • valuesdelimiterで区切られた文字列のリストである。
  • 結果として得られる配列は、文字列の配列となります。
  • デリミタは、指定されなければ ',' です。デリミタは、文字列 (デリミタを囲む空白は切り取られます) または、例えば /\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 は、wiki のリンク、テンプレート、パーサー関数を受け付けます。
  • subjectの中では、パイプ文字'|'をエスケープする必要はありません。 全体の構成の中で、patternは検索され、各ループの現在の(エスケープされた)配列の値に置き換えられます。 最後に、文字列全体が解析され、delimiterをセパレータとして暗算された結果の配列に入れられる。
  • 表示すべき配列が存在しない場合、空文字列を返します (1.4 alpha で導入された、互換モードの一部)。
  • 既定の区切り文字は言語に依存し、英語の場合は「, 」です (2.0 で導入され、互換モードの一部となりました)。

例:

Task Example code Output (the array b is defined above)
プリント - 言語に依存するデフォルトのリストデリミタを使用する
{{#arrayprint:b}}
  • orange, red, yellow, yellow
プリント - デリミタなし
{{#arrayprint:b | }}
  • orangeredyellowyellow
プリント - 区切り記号として '‎<br />' (改行) を使用します。
{{#arrayprint:b |<br/> }}
orange

red

yellow

yellow

最後の2つの要素が' and '(あるいはそれに相当する現地語)で連結されたきれいなリスト出力です。 たとえ delimiter パラメーターが空でも、「, 」(または各言語の同等のもの) が使用されます。
{{#arrayprint:b ||@ |@ |print=pretty }}
カテゴリへのWikiリンクの埋め込み
{{#arrayprint:b |<br/> |@@@@ |[[:Category:@@@@|@@@@]] }}
orange

red

yellow

yellow

セマンティックな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:b}} | ''配列存在'' | ''配列非定義'' }}

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 がwiki内で利用可能であれば、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

この関数は、配列('1'で指定)から部分配列を取り出し、新しい配列('2'で指定)に格納します。

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

この関数は、配列を次の順序でソートする。

構文:

{{#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 }}

注記:

  • これは集合演算子であり、返される配列は重複した値を持たない集合である。
  • これは、arraymergearrayuniqueで後払いするのと同じことです。

例:

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' );
    
  • 必要に応じて設定します。
  • Yes 完了 – ウィキの「Special:Version」に移動して、拡張機能が正しくインストールされたことを確認します。

設定

Arrays2.0では、2つの設定変数が導入されています。

$egArraysCompatibilityMode
(1.4 alphaでは$egArrayExtensionCompatbilityMode)trueに設定すると、互換モードが有効になり、古い ArrayExtension 1.3.2の挙動を可能な限り復活させます。 これは、Version 2.0において、いくつかの破壊的な変更が導入されたためです。 そのため、この互換モードを使用することで、1.xから2.xのArraysエクステンションへの切り替えがスムーズに行えます。 デフォルトでは、互換モードは非アクティブです。 もし、以前にあなたのwiki内で古いArrayExtensionを使用していたならば、互換性モードなしでArraysに切り替える前に、そのリストを見て、テンプレートを調整した方がいいかもしれません。
$egArraysExpansionEscapeTemplates
テンプレートまたはパーサーの関数呼び出しによって、#arrayprint に含まれる配列値内で置換されるべき文字のキーと値のペアのリストが含まれています。 これらの特殊文字を置換してから値を展開することで、配列の値が周囲のMWコードに影響を与えることがなくなります。 そうでなければ、配列の値自体も解析されてしまいます。デフォルトでは、これは以下のテンプレートやパーサーの関数呼び出しで、以下の文字をエスケープします。
  • = = {{=}} ("Template:=" は '=' と表示されるはずです)
  • | = {{!}} ("Template:!" は '|' と表示されるはずです)
注 注: MW 1.24.0から、"Template:!"は新しいマジックワードである{{!}} で目的を果たすため、作成する必要がなくなりました。
  • {{ = {{((}} ("Template:((" は '{{' と表示されるはずです)
  • }} = {{))}} ("Template:))" は '}}' と表示されるはずです)
これらのテンプレートやパーサー関数があなたのwikiに存在することを確認するか、この変数を適宜変更してください。 この設定を誤ると、配列の値でこれらの文字列のいずれかを使用している場合、#arrayprintが予期しない値を表示することがあります。
$egArraysExpansionEscapeTemplatesは単純にnullに設定することもできます。この場合、2.0以前の動作に戻り、これらの文字列を含む配列の値は、#arrayprintの中で与えられたsubjectのコードを破ることになります。 互換モードが有効な場合は、常にnullに設定されているものとして扱われます。

よくある質問

配列要素への繰り返しアクセス

配列の要素に#arrayprintExtension:Loops を用いて繰り返しアクセスすることが可能である。

arrayprintを使用

<!-- 配列を定義する -->
{{#arraydefine:colors|Red,Blue,Yellow}}

{{#arrayprint:colors||@@@@|<nowiki/>
* @@@@の長さ: {{#len:@@@@}}
}}

以下は、期待される出力です。

  • Redの長さ: 3
  • Blueの長さ: 4
  • Yellowの長さ: 6

その他の例は、旧テザーレス・ワールドWikiで見ることができます。

キーの再利用

一度定義した配列をプリントすれば、同じキーをさらに下の階層の配列に再利用することができます。この順序を守る限り、すべてのアレイに一意のキーを定義する必要はありません。

ループ拡張機能の使用

より複雑なタスクのために、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

Extension:Semantic MediaWiki との連携

配列にセマンティックデータを入力する方法は2つあります。 最初のソリューションであるセマンティックリザルトフォーマットは、より高速で信頼性が高く、レコードデータや1つのプロパティに対する複数の値を含む複雑なデータセットにも対応しています。

Extension:Semantic Result Formats を使用

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. 配列 'colors'を作成する
{{#arraydefine:colors|red;#da2021, yellow;#fcff00, green;#00ff00}}

2. 'colors' の最初の要素を別の配列 'colors0' に分割する。
{{#arraydefine:color0|{{#arrayindex:colors|0}}|;}}

注記:

  • セマンティッククエリパラメータ
    • limit=1000 オプションは、セマンティッククエリの返された結果をすべて使い切るために使用されます。
    • sep=, オプションは、結果のエントリのセパレータを設定するために使用されます。
    • ページカラムを切り取るmainlabel=-オプション

Extension:DynamicPageList との連携

SMW の場合と同様に、Arrays 拡張機能を使用して 'DPL query の結果を保存することができます。 結果リストを反転を反転できます。 特定のページが特定のテンプレートを含むときに使用されるすべてのパラメータ値を収集します。 テンプレートパラメータ値 ページ名 のペアを保存します。 そして、配列をソートしてペアを表示します。 連続した配列要素の最初の部分が同じ(つまりパラメータ値が同じ)場合、最初の部分は一度だけ表示されます。 このように、単純な転置インデックスを構成することができる。 同じ仕組みは、他の問題にも応用できるはずだ。


関連項目

  • Extension:HashTables - MediaWikiでハッシュテーブルを使用するための非常によく似た拡張機能です。
  • Extension:PhpTags Functions/Functions/Array - PHP の構文を使って配列を操作するための 50 以上の関数が含まれています。
  • Extension:Variables
  • Extension:Page Forms - パーサー関数#arraymap を提供します。 入力と出力が同じ関数で処理されるため、キーを定義する必要がなくなります。
  • Extension:WSArrays - 多次元配列や連想配列を操作するためのパーサ関数群を提供します。
  • Extension:Scribunto - Scribuntoは、WikipageにLuaスクリプトを埋め込むことができ、配列と標準的な命令型プログラミング言語の制御フローを提供します。
  • Extension:ArrayFunctions - a Parsoid-compatible alternative, that also works with multidimensional and associative arrays.