Extension:Arrays
Release status: beta |
|
|---|---|
| Implementation | Parser function |
| Description | Enhances parser with array functions. |
| Author(s) | Li Ding and Jie Bao |
| Latest version | 1.1 (5 February 2009) |
| MediaWiki | 1.13+ |
|
|
| Licence | MIT License |
| Download | Subversion [Help] Browse source code |
| Help | Help:Extension:Arrays |
| Example | examples |
ArrayExtension defines an additional set of parser functions that operate on arrays.
Functions
This module defines these functions:
| group | functions |
|---|---|
| construct an array, (no print) | #arraydefine |
| print array | #arrayprint,#arraysize,#arraysearch, and #arrayindex |
| alter an array (no print) | #arraysort, #arrayunique, and #arrayreset |
| create a new array (no print) | #arraymerge, and #arrayslice |
| create a new array without duplicates (no print) | #arrayintersect,#arraydefine,and #arraydiff |
arraydefine
This function constructs an array (identified by 'key') using a list of 'values' separated by the 'delimiter'. The variable can be accessed by other functions later.
Syntax:
{{#arraydefine:key|values|delimiter}}
Note(s):
- 'values' is a list of strings separated by 'delimiter'
- the resulting array is an array of strings.
- the default delimiter is ',' if not specified, a delimiter can be (i) a string (the white-spaces surrounding delimiter will be trimmed) or (ii) a perl regular expression (for advanced user only), e.g. '/\s*,\s*/' (see preg_split)
- this function shows nothing
- users can define an empty array, or reset an array by leaving the 'values' empty (see example)
Example(s):
| define a one-element array named 'a' | {{#arraydefine:a|red}}
|
| define a four-element array named 'b', use default delimiter (',') | {{#arraydefine:b|orange,red ,yellow, yellow}}
|
| define/set an array named 'c' empty | {{#arraydefine:c}}
|
| define a one-element array named 'd', use no delimiter | {{#arraydefine:d|apple, pear}}
|
| define a one-element array named 'e', using ';' as delimiter | {{#arraydefine:e|apple, pear|;}}
|
| (advanced user only) define a three-element array named 'f', using '/\s*[;,]\s*/' as delimiter | {{#arraydefine:f|apple, pear; orange|/\s*[;,]\s*/}}
|
arrayprint
This function prints the values of an array in customizable format.
Syntax:
{{#arrayprint:key|delimiter|pattern|template}}
The customizable output format is:
template<value_1> delimiter template<value_2> delimiter ... delimiter template<value_n>
Note(s):
- the 'template' should not embed wiki template ''{{...}}''.
- warning: templates or parser functions defined in the output will only be printed instead of being executed.
Example(s):
| print - use default delimiter ',' | {{#arrayprint:b}}
|
| print - use '' as delimiter | {{#arrayprint:b|}}
|
| print - use '<br>' as delimiter | {{#arrayprint:b|<br/>}}
|
| print - use pattern to create wiki links | {{#arrayprint:b|<br/>|@@@@|[[@@@@]]}}
|
| print - add pattern to create SMW links | {{#arrayprint:b|<br/>|@@@@|[[name::@@@@]]}}
|
arraysize
This function returns the size (number of elements) of an array. See: http://www.php.net/manual/en/function.count.php
Syntax:
{{#arraysize:key}}
Example(s):
| size: | {{#arraysize:b}}
|
arraysearch
This function returns the index of the first occurrence of the 'value' in the array (identified by 'key'), and returns '-1' when failed. See: http://www.php.net/manual/en/function.array-search.php
Syntax:
{{#arraysearch:key|value}}
Example(s):
| search first occurrence of a value | {{#arraysearch:b|white}}
{{#arraysearch:b|red}}
|
arrayindex
This function print the value of an array (identified by 'key') at position 'index'.
Syntax:
{{#arrayindex:key|value}}
Note(s):
- invalid index (non-number, out of bound) will result in printing an empty string.
- the index is 0-based, i.e. the first element's index is 0.
Example(s):
| array index test | {{#arrayindex:b|2}}
|
arraysort
This function sorts an array in the following order. See: http://www.php.net/manual/en/function.sort.php; http://www.php.net/manual/en/function.rsort.php; http://www.php.net/manual/en/function.array-rand.php
- none (default) - no sort
- desc - in descending order
- asce - in ascending order
- random - in random order
Syntax:
{{#arraysort:key|order}}
Note(s):
- each array element is a string
Example(s):
| sort an array | {{#arraysort:x|desc}}
|
| randomize an array | {{#arraysort:x|random}}
|
arrayunique
This function converts an array (identified by 'key') into a set (no duplicated members). see: http://www.php.net/manual/en/function.array-unique.php
Syntax:
{{#arrayunique:key}}
Example(s):
| convert array to set | {{#arrayunique:b}}
|
arrayreset
This function free-up all defined arrays.
Syntax:
{{#arrayreset:}}
arraymerge
This function merges values of two arrayes (identified by 'key1' and 'key2') into a new array (identified by 'key'). See: http://www.php.net/manual/en/function.array-merge.php
Syntax:
{{#arraymerge:key|key1|key2}}
Note(s):
- this merge is different from array_merge offered by PHP because it merges values instead of keys
Example(s):
| merge two arrays | {{#arraymerge:x|a|b}}
|
| duplicate an array (keep the third argument of arraymerge empty | {{#arraymerge:x|b}}
|
arrayslice
This function extract a sub-array from an array (identified by 'key1') into a new array (identified by 'key'). See: http://www.php.net/manual/en/function.array-slice.php
Syntax:
{{#arrayslice:key|key1|offset|length}}
Note(s):
- offset indicates starting point of slice, it can be (i) non-negative number (ii) negative number for backwards index (e.g. the last element of the array's offset is -1)
- length indicates how many element to extract. If it is omitted, then the sequence will have everything from offset up until the end of the array.
Example(s):
| extract a two-element slice starting from the element at offset 1 | {{#arrayslice:x|b|1|2}}
|
| extract a two-element slice starting from the element at offset -2 | {{#arraymerge:x|b|-2|2}}
|
arrayintersect
This function computes the set theoretic intersection of two given arrays (identified by 'key1' and 'key2'), and the result array is identified by 'key'. See: http://www.php.net/manual/en/function.array-intersect.php
Syntax:
{{#arrayintersect:key|key1|key2}}
Note(s):
- this is a set operator, i.e., the returned array is a set without duplicated values.
Example(s):
| intersect | {{#arrayintersect:x|a|b}}
|
arrayunion
This function computes the set theoretic union of two given arrays (identified by 'key1' and 'key2'), and the result array is identified by 'key'. See: http://www.php.net/manual/en/function.array-union.php
Syntax:
{{#arrayunion:key|key1|key2}}
Note(s):
- this is a set operator, i.e., the returned array is a set without duplicated values.
- similar to arraymerge, this union operation works on values.
Example(s):
| union | {{#arrayunion:x|a|b}}
|
arraydiff
This function computes the (set theoretic) difference of two given arrays (identified by 'key1' and 'key2'), and the result array is identified by 'key'. The returned array (identified by 'key') is a set that contains elements in an array (identified by 'key1') but not in the other array (identified by 'key2'). See: http://www.php.net/manual/en/function.array-diff.php
Syntax:
{{#arraydiff:key|key1|key2}}
Note(s):
- this is a set operator, i.e., the returned array is a set without duplicated values.
- this function can be used to test sub-class relation
Example(s):
| diff (b-a) | {{#arraydiff:x|b|a}}
|
| diff (a-b) | {{#arraydiff:x|a|b}}
|
Installation
This extension has been tested on MediaWiki 1.13+ and PHP 5. But most of its functions are compatible with PHP 4, so it is reasonable to try this extension on earlier versions of MediaWiki. Please use the following instructions to install this extension.
1. Install source code
- you can copy the source code from SVN, and put them under "WIKI-PATH/extentions/ArrayExtension"
- or if you have shell access, you can install using svn
svn co http://smwbp.googlecode.com/svn/trunk/mediawiki/extensions/ArrayExtension/
2. Append the following to LocalSettings.php (near the bottom) of your MediaWiki installation:
require_once ("$IP/extensions/ArrayExtension/ArrayExtension.php");
FAQ
work with Extension:SemanticMediaWiki
ArrayExtension allows users to populate an array using a SMW query result.
Example A. to create a list of instances of the class 'Color'
{{#arraydefine:colors|{{#ask:[[Category:Color]][[:+]] |sep =, |limit=1000}} }}
Example B. to create a unique list of values of property 'has color'
{{#arraydefine:colors|{{#ask:[[has color::+]][[:+]] |?color= |mainlabel=- |sep =, |limit=1000}} |,|unique}}
Example C. to deal with 2D array generated by SWM query (e.g. n-ary property)
given a 2D array "red;#da2021, yellow;#fcff00, green;#00ff00"
1. create an array 'colors'
{{#arraydefine:colors|red;#da2021, yellow;#fcff00, green;#00ff00}}
2. split the first element of 'colors' into another array 'colors0'
{{#arraydefine:color0|{{#arrayindex:colors|0}}|;}}
Note(s)
- semantic query parameters
- 'limit=1000' option is used to exhaust all returned results of the semantic query
- 'sep=,' option is used to set the separator for entries of the results
- 'mainlable=-' option cut of the page column
work with Extension:Loops, iteratively access array elements
We can iteratively access elements of an array. The following code requires mediawiki extensions:
<!--define an array-->
{{#arraydefine: colors|Red,Blue,Yellow}}
<!--iteratively visit elements of an array -->
<!--
initialize variable i
-->{{#vardefine: i | 0 }}<!--
run loop
-->{{#while:
| {{ #ifexpr: {{ #var: i }} < {{#arraysize:colors}} | true }}
|<!--
one loop iteration
--><nowiki/>
* {{ #var: i }}: {{#arrayindex:colors|{{ #var: i }} }} <!--
increment i
-->{{ #vardefine: i | {{ #expr: {{ #var: i }} + 1 }} }}
}}
below is the expected output:
|
for live examples, follow this URL
work with Extension:SemanticQueryFormTool
ArrayExtension allows users to populate an array using a SemanticQueryFormTool query result.
to create a list of instances of the class 'Color'
{{#arraydefine: colors|{{#sask: ?Color | format=list | lastsep=}} }}
source: thanks for zehetner@molgen.mpg.de
related MediaWiki extensions
Change Log
ArrayExtension 1.1 has been tested on MediaWiki versions 1.13.3.
History:
- Feb 05, 2009 -- v1.1
- update #arraydefine: replacing 'explode' by 'preg_split',
and we now allow delimitors to be (i) a string; or (ii) a perl regular expressnion pattern, sourrounded by '/', e.g. '/..blah.../'
- update #arrayprint, change parameters from "prefix","suffix" to a "template",
and users can replace a substring in the template with array value, similar to arraymap in semantic forms
- update #arrayunique, empty elements will be removed
- update #arraysort: adding "random" option to make the array of values in random order
- add #arrayreset to free all defined arrays for memory saving
- add #arrayslice to return an array bounded by start_index and length.
- add #arraysearch. now we can return the index of the first occurence of an element, return -1 if not found
- remove #arraymember, obsoleted by #arraysearch
- remove #arraypush, obsoleted by #arraydefine and #arraymerge
- remove #arraypop, obsoleted by #arrayslice
- add safty check code to avoid unset parameters
- Feb 01, 2009 -- v1.0.3 -- fixed bug on arrayunique, array_unique (PHP function) only makes values unique but does not update array index. (arraydefine is also affected)
- Jan 28, 2009 -- v1.0.2 -- fix #arraypop to support pop multiple elements; add #arrayindex
- Jan 27, 2009 -- v1.0.1 -- fix #arraydefine to support defining an empty string
- Jan 27, 2009 -- v1.0 -- First release(alpha).
