This [[Module Library|XQuery Module]] contains functions for manipulating arrays, which has been introduced with [[XQuery 3.1#Arrays|XQuery 3.1]] and extended with [[XQuery 4.0#Arrays|XQuery 4.0]].
=Conventions=
=Functions=
==array:sizeappend==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:sizeappend( $input array as array(*), $member as item()*) as xs:integerarray(*)</pre>
|- valign="top"
| '''Summary'''
| Returns the number a copy of members in {{Code|$array}}. Note that because an array is an item, the with {{Code|fn:count}} function when applied to an array always returns {{Code|1$member}}attached.
|- valign="top"
| '''Examples'''
|
* <code>array:sizeappend(array { 1 to 10 }[], 'member1')</code> returns the array {{Code|10}}.* <code>array:size([1 to 10"member1"])</code> returns {{Code|1}}, because the array contains a single sequence with 10 integers.
|}
==array:getbuild==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:getbuild( $array input as arrayitem()*), $position action as function(item()) as xsitem()* := fn:integeridentity#1) as itemarray(*)*</pre>
|- valign="top"
| '''Summary'''
| Returns an {{Code|$array}} obtained by evaluating the supplied function {{Code|$arrayaction}} member at once for each item in the specified {{Code|$positioninput}}sequence. |- valign="top"| '''Examples'''| <ul> <li> <code>array:build(1 to 5)</code> returns <code>[1,2,3,4,5]</code> </li> <li> <code>array:build(1 to 5, function { 2 * . })</code> returns <code>[2,4,6,8,10]</code> </li> <li> <code>array:build(1 to 5, function { 1 to . })</code> returns <code>[1,(1,2),(1,2,3),(1,2,3,4),(1,2,3,4,5)]</code> </li> <li> <code>array:build(1 to 5, function { array { 1 to . } })</code> returns <code>[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]</code> </li> <li> <code>array:build(("red", "green", "blue"), characters#1)</code> returns <code>[("r","e","d"),("g","r","e","e","n"),("b","l","u","e")]</code> </li></ul>|} ==array:empty== {| width='100%'| width='120' | '''Signature'''|<pre>array:empty( $array as array(*) ) as xs:boolean</pre>
|- valign="top"
| '''ErrorsSummary'''|{{Error|FOAY0001|#Errors}} Returns {{Code|$positiontrue}} is not in if the range supplied {{Code|1}} to {{Code|array:size($array)}} inclusivecontains no members.
|- valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:getempty(["a", "b", "c"])</code> returns <code>false()</code> </li> <li> <code>array { reverse:empty(1 to 5[]) }, 5</code> returns <code>true()</code> </li> <li> <code>array:empty([[]])</code> returns <code>false()</code> </li> <li> <code>array:empty([()])</code> returns the value {{Code|1}}. <code>false()</code> </li></ul>
|}
==array:appendexists==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:appendexists( $array as array(*), $member ) as item()*xs:boolean) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Returns a copy of {{Code|$arraytrue}} with a new if the supplied {{Code|$memberarray}} attachedcontains one or more members.
|- valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:exists(["a", "b", "c"])</code> returns <code>true()</code> </li> <li> <code>array:appendexists([], 'member1')</code> returns <code>false()</code> </li> <li> <code>array:exists([[]])</code> returns the <code>true()</code> </li> <li> <code>array {{Code|:exists(["member1"()]}}.)</code> returns <code>true()</code> </li></ul>
|}
==array:subarrayfilter==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:subarrayfilter( $array as array(*), $position predicate as xs:integer, $length function(item()*) as xs:integer := ()boolean
) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Constructs Returns a new array with with those members of {{Code|$lengtharray}} members of for which {{Code|$arraypredicate}} beginning from the specified returns {{Code|$positiontrue}}.<br/>|- valign="top"| '''Examples'''|The two-argument version of the function following query returns the same result as the three-argument version when called with array {{Code|[0, 1, 3]}}:<pre lang='xquery'>array:filter( array { 0, 1, -2, 3, -4 }, function($i) { $lengthi > 0 })</pre>|} equal to the value of ==array:flatten== {{Code|width='100%'| width='120' | '''Signature'''|<pre>array:sizeflatten( $arrayitems as item()*) as item() - $position + 1}}.*</pre>
|- valign="top"
| '''ErrorsSummary'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is less than one, or if {{Code|$position + $length}} is greater than {{Code|array:size($array) + 1}}.<br/>{{Error|FOAY0002|#Errors}} Recursively flattens all arrays that occur in the supplied {{Code|$lengthitems}} is less than zero.
|- valign="top"
| '''Examples'''
|
* <code>array:subarrayflatten(["a", "b"])</code> returns the sequence {{Code|"a", "cb"}}.* <code>array:flatten([1,[2,3], 24]])</code> returns the array sequence {{Code|[1, 2, 3, 4}}.|} ==array:fold-left== {| width='100%'| width='120' | '''Signature'''|<pre>array:fold-left( $array as array(*), $zero as item()*, $action as function(item()*, item()*) as item()*) as item()*</pre>|- valign="btop"| '''Summary'''| Evaluates the supplied {{Code|$action}} cumulatively on successive members of the supplied {{Code|$array}} from left to right, and uses {{Code|$zero}} as first argument.|- valign="ctop"]| '''Examples'''|The following query returns {{Code|55}} (the sum of the integers 1 to 10):<pre lang='xquery'>array:fold-left( array { 1 to 10 }, 0, function($a, $b) { $a + $b }.)</pre>
|}
==array:putfold-right==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:putfold-right( $array as array(*), $position zero as xs:integeritem()*, $member action as function(item()*, item()*) as item()*) as arrayitem()*)</pre>
|- valign="top"
| '''Summary'''
| Returns a copy of Evaluates the supplied {{Code|$arrayaction}} with cumulatively on successive members of the supplied {{Code|$memberarray}} replaced at the specified from right to left, and uses {{Code|$positionzero}}as first argument. Equivalent |- valign="top"| '''Examples'''|The following query is equivalent to the expression <code>$array :reverse(array { 1 to 5 })</code>:<pre lang='xquery'> array { array:removefold-right( array { 1 to 5 }, (), function($positiona, $b) { $b, $a } )}</pre>|} ==array:foot== {| width='100%'| width='120' | '''Signature'''|<pre> array:insert-beforefoot( $position, $memberarray as array(*) ) as item()*</codepre>.
|- valign="top"
| '''ErrorsSummary'''|{{Error|FOAY0001|#Errors}} Returns the last member of an array, that is {{Code|$position}} is not in the range {{Code|1}} to {{Code|array(array:size($array))}} inclusive.
|- valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:putfoot([5, 6, 7, 8])</code> returns <code>8</code> </li> <li> <code>array:foot([["a", "b"], ["c"], 2, "d"]])</code> returns the <code>["c","d"]</code> </li> <li> <code>array {{Code|:foot([("a", "db"), ("c", "d")]}}.)</code> returns 2 results <code>"c"</code> and <code>"d"</code> </li></ul>
|}
==array:removefor-each==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:removefor-each( $array as array(*), $positions action as xs:integerfunction(item()*) as item()*
) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Returns a copy new array, in which each member is computed by applying {{Code|$action}} to the corresponding member of {{Code|$array}} without .|- valign="top"| '''Examples'''|The following query returns the member at the specified array {{Code|[2, 3, 4, 5, 6]}}: <pre lang='xquery'>array:for-each( array { 1 to 5 }, function($i) { $positionsi + 1})</pre>|}. ==array:for-each-pair== {| width='100%'| width='120' | '''Signature'''|<pre>array:for-each-pair( $array1 as array(*), $array2 as array(*), $action as function(item()*) as item()*) as array(*)</pre>
|- valign="top"
| '''ErrorsSummary'''|Returns a new array obtained by evaluating the supplied {{ErrorCode|FOAY0001|#Errors$action}} A for each pair of members at the same position is not in the range {{Code|1$array1}} to and {{Code|array:size($array)array2}} inclusive.
|- valign="top"
| '''Examples'''
|The following query returns the array {{Code|[5, 7, 9]}}:* <codepre lang='xquery'>array:appendfor-each-pair([" array { 1 to 3 }, array { 4 to 6 }, function($a + $b) { $a"], 1+ $b })</codepre> returns the array {{Code|[]}}.
|}
==array:insert-beforeget==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:insert-beforeget(
$array as array(*),
$position as xs:integer, $member ) as item()*) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Returns a copy of the {{Code|$array}} with one new {{Code|$member}} at the specified {{Code|$position}}. Setting {{Code|$position}} to the value {{Code|array:size($array) + 1}} yields the same result as {{Code|array:append($array, $insert)}}.
|- valign="top"
| '''Errors'''
|{{Error|FOAY0001|#Errors}} {{Code|$position}} is not in the range {{Code|1}} to {{Code|array:size($array) + 1}} inclusive.
|- valign="top"
| '''Examples'''
|
* <code>array:insert-beforeget(array { reverse(["a"], 1to 5) }, "b"5)</code> returns the array value {{Code|["b", "a"]1}}.
|}
|}
==array:tailindex-where==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:tailindex-where( $array as array(*), ) $predicate as arrayfunction(item()*, xs:integer) as xs:boolean )as xs:integer*</pre>
|- valign="top"
| '''Summary'''
| Returns a new array with all members except the first from position in an input {{Code|$array}}. This function is equivalent to the expression of members that match a supplied {{Code|array:remove($array, 1)}}.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errorspredicate}} The array is empty.
|- valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:insertindex-beforewhere(["a"0, (), 4, 9], boolean#1)</code> returns <code>()</code> </li> <li> <code>array:index-where([0, (), 4, 9], "b"boolean#1)</code> returns the <code>(3, 4)</code> </li> <li> <code>array:index-where( array {1 to 10 }, function {Code|. mod 2 = 0 })</code> returns <code>(2, 4, 6, 8, 10)</code> </li> <li> <pre>array:index-where( ["bJanuary", "February", "March", "April", "May", "June", "July", "August", "September", "aOctober", "November", "December"], contains(?, "r"))</pre> returns <code>(1, 2, 3, 4, 9, 10, 11, 12)</code> </li> <li> <pre>array:index-where( [(1, 2, 3), (4, 5, 6), (7, 8)], function($m) { count($m) = 3 })</pre> returns <code>(1, 2)</code> </li> <li> <pre>array:index-where( [ 1, 8, 2, 7, 3 ], fn($member, $pos) { $member < 5 and $pos > 2 }.)</pre> returns <code>(3, 5)</code> </li></ul>
|}
==array:reverseinsert-before==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:reverseinsert-before( $array as array(*), $position as xs:integer, $member as item()* ) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Returns a new an array with containing all the members of the supplied {{Code|$array}} in reverse order, with one additional {{Code|$member}} at a specified {{Code|$position}}.
|- valign="top"
| '''Examples'''
|
* <codeul> <li> <pre>array:reverseinsert-before(array { 1 to ["a", "b", "c", "d"], 3 }, ("x", "y"))</pre> returns <code>["a", "b", ("x", "y"), "c", "d"]</code> </li> <li> <pre>array:insert-before( ["a", "b", "c", "d"], 5, ("x", "y"))</pre> returns the <code>["a", "b", "c", "d", ("x", "y")]</code> </li> <li> <pre>array {{Code|:insert-before( ["a", "b", "c", "d"], 3, 2 ["x", "y"])</pre> returns <code>["a", "b", ["x", "y"], 1"c", "d"]}}.</code> </li></ul>
|}
==array:join==
* <code>array:join(())</code> returns the array {{Code|[]}}.
* <code>array:join((1 to 3) ! array { . })</code> returns the array {{Code|[1, 2, 3]}}.
* <code>array:join((["a", "b"], ["c", "d"]))</code> returns the array {{Code|["a", "b", "c", "d"]}}.
* <code>array:join((["a", "b"], ["c", "d"], [ ]))</code> returns the array {{Code|["a", "b", "c", "d"]}}.
* <code>array:join((["a", "b"], ["c", "d"], [["e", "f"]]))</code> returns the array {{Code|["a", "b", "c", "d", ["e", "f"]]}}.
|}
==array:members==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:members(
$array as array(*)
) as record(value as item()*)*
</pre>
|- valign="top"
| '''Summary'''
| Delivers the contents of an {{Code|$array}} as a sequence of value records.
|- valign="top"
| '''Note'''
| This function is the inverse of [[#array:of-members|array:of-members]].
|- valign="top"
| '''Examples'''
|
<ul>
<li><code>array:members([])</code> returns {{Code|()}}.</li>
<li><code>array:members([1 to 5])?value</code> returns {{Code|(1, 2, 3, 4, 5)}}.</li>
<li><code>array:members([(1,1), (2,4), (3,9), (4,16), (5,25)]) ! sum(?value)</code> returns {{Code|(2, 6, 12, 20, 30)}}.</li>
<li><pre>let $array := [ "any array" ]
return deep-equal(
$array,
array:of-members(array:members($array))
)</pre> returns {{Code|true()}}</li>
</ul>
|}
==array:flattenof-members==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:flattenof-members( $items input as record(value as item()*)*) as itemarray(*)*</pre>
|- valign="top"
| '''Summary'''
| Recursively flattens all arrays that occur in Constructs an array from the supplied contents of an {{Code|$itemsinput}}sequence of value records.|- valign="top"| '''Note'''| This function is the inverse of [[#array:members|array:members]].
|- valign="top"
| '''Examples'''
|
* <ul> <li><code>array:flattenof-members(())</code> returns {{Code|["a","b"]}}.</li> <li><code>array:of-members(map { 'value': (1 to 5) })</code> returns the sequence {{Code|"a"[(1, "b"2, 3, 4, 5)]}}.</li>* <li><code>array:flattenof-members((1 to 5) ! map { 'value': . })</code> returns {{Code|[1,[2,3],4, 5]]}}.</li> <li><code>array:of-members((1 to 5) ! map { 'value': (., .*.) })</code> returns the sequence {{Code|[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]}}.</li></ul>
|}
==array:for-eachput==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:for-eachput(
$array as array(*),
$function position as function(xs:integer, $member as item()*)
) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Returns a new copy of {{Code|$array}} with {{Code|$member}} replaced at the specified {{Code|$position}}. Equivalent to <code>$array => array:remove($position) => array:insert-before($position, in which each $member )</code>.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is computed by applying not in the range {{Code|$function1}} to the corresponding member of {{Code|array:size($array)}}inclusive.
|- valign="top"
| '''Examples'''
|The following query * <code>array:put(["a", "b", "c"], 2, "d")</code> returns the array {{Code|[2, 3"a", 4"d", 5, 6"c"]}}.|} ==array:remove==
{| width='100%'| width='120' | '''Signature'''|<syntaxhighlight lang="xquery"pre>array:for-eachremove( $array { 1 to 5 } as array(*), function$positions as xs:integer*) as array(*)</pre>|- valign="top"| '''Summary'''| Returns a copy of {{Code|$i) array}} without the member at the specified {{ Code|$i + positions}}.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errors}} A position is not in the range {{Code|1}} to {{Code|array:size($array)}} inclusive.|- valign="top"| '''Examples'''|* <code>array:append(["a"], 1)</syntaxhighlightcode>returns the array {{Code|[]}}.
|}
==array:filtersize==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:filtersize( $array as array(*), $function as function(item()*)) as array(*)xs:integer</pre>
|- valign="top"
| '''Summary'''
| Returns a new array with those the number of members of in {{Code|$array}} for which . Note that because an array is an item, the {{Code|$functionfn:count}} function when applied to an array always returns {{Code|true1}}.
|- valign="top"
| '''Examples'''
|The following query * <code>array:size(array { 1 to 10 })</code> returns the array {{Code|[0, 1, 3]10}}:.* <syntaxhighlight lang="xquery"code>array:filtersize( array { 0, [1, -2, 3, -4 }, function($i) { $i > 0 }to 10])</syntaxhighlightcode>returns {{Code|1}}, because the array contains a single sequence with 10 integers.
|}
==array:fold-leftsubarray==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:fold-leftsubarray(
$array as array(*),
$zero position as item()*xs:integer, $function length as xs:integer as function(item:= ()*, item()*) as itemarray()*) as item()*</pre>
|- valign="top"
| '''Summary'''
| Evaluates the supplied Constructs a new array with with {{Code|$functionlength}} cumulatively on successive members of the supplied {{Code|$array}} beginning from left to right and using the specified {{Code|$zeroposition}} .<br/>The two-argument version of the function returns the same result as first the three-argumentversion when called with {{Code|$length}} equal to the value of {{Code|array:size($array) - $position + 1}}.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is less than one, or if {{Code|$position + $length}} is greater than {{Code|array:size($array) + 1}}.<br/>{{Error|FOAY0002|#Errors}} {{Code|$length}} is less than zero.
|- valign="top"
| '''Examples'''
|The following query returns {{Code|55}} (the sum of the integers 1 to 10):* <syntaxhighlight lang="xquery"code>array:fold-leftsubarray( array { 1 to 10 }["a", 0"b", function($a"c"], $b2) </code> returns the array { $a + ${Code|["b ", "c"]})</syntaxhighlight>}.
|}
==array:fold-righttail==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:fold-righttail( $array as array(*), $zero as item()*, $function as function(item()*, itemarray()*) as item()*) as item()*</pre>
|- valign="top"
| '''Summary'''
| Evaluates Returns a new array with all members except the supplied first from {{Code|$functionarray}} cumulatively on successive members of . This function is equivalent to the supplied expression {{Code|array:remove($array, 1)}} from right to left and using .|- valign="top"| '''Errors'''|{{CodeError|FOAY0001|$zero#Errors}} as first argumentThe array is empty.
|- valign="top"
| '''Examples'''
|The following query is equivalent to the expression * <code>array:reverseinsert-before(array { ["a"], 1 to 5 }, "b")</code>:<syntaxhighlight lang="xquery">array { array:fold-right( returns the array { 1 to 5 }, (), function($a, $b) { $Code|["b", $"a "]} )}</syntaxhighlight>.
|}
==array:for-each-pairreverse==
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:for-each-pairreverse( $array1 as array(*), $array2 as array(*), $function as function(item()*)
) as array(*)</pre>
|- valign="top"
| '''Summary'''
| Returns a new array obtained by evaluating the supplied with all members of {{Code|$functionarray}} for each pair of members at the same position in {{Code|$array1}} and {{Code|$array2}}reverse order.
|- valign="top"
| '''Examples'''
|The following query returns the array {{Code|[5, 7, 9]}}:* <syntaxhighlight lang="xquery"code>array:for-each-pairreverse( array { 1 to 3 }, )</code> returns the array { 4 to 6 {Code|[3, 2, 1]}, function($a + $b) { $a + $b })</syntaxhighlight>.
|}
|<pre>array:sort(
$array as array(*),
$collation as xs:string? := (), $key as function(item()*) as xs:anyAtomicType* := ()
) as array(*)</pre>
|- valign="top"
|The specified length is less than zero.
|}
=Changelog=
;Version 11.0
* Added: {{Function||array:build}}
* Added: {{Function||array:foot}}
* Added: {{Function||array:members}}
* Added: {{Function||array:of-members}}
;Version 8.6