Scott McC
: cyberfunkr at, yahoo d0t com
02/04/2011 22:27 p.m.
02/04/2011 22:27 p.m.
In my testing, it looks like the miva_array_sort() function will only sort on the alphabetically superior structure name. So if you have an array like: g.product[1]:name="apple" g.product[1]:price="1.50" g.product[1]:color="green" g.product[1]:code="grannysmith" It will sort on :code. So to get around it you can do one of two things: 1) As you load in your array, double assign price; once as ':price' and once as ':a' and then sort. or 2) Load in your array, loop through it adding a new structure element called ':a' that is a duplicate of ':price', sort, and then optionally remove ':a' Version one is quicker as it's less loops through an array. Here is a clunky function to use method 2, including the callback:
<MvFUNCTIONNAME="Miva_Array_Sort_By"PARAMETERS="element, array var"STANDARDOUTPUTLEVEL=""><MvASSIGNNAME="l.max"VALUE="{ miva_array_max( l.array ) }>"<MvASSIGNNAME="l.pos"VALUE="{ miva_array_min( l.array ) }>"<MvWHILEEXPR="{ l.pos LE l.max }>"<MvASSIGNNAME="l.array"INDEX="{ l.pos }"MEMBER="a"VALUE="{ miva_variable_value( 'l.array[' $ l.pos $ ']:' $ l.element ) }>"<MvASSIGNNAME="l.pos"VALUE="{ miva_array_next( l.array, l.pos ) }>"</MvWHILE><MvASSIGNNAME="l.sort"VALUE="{ miva_array_sort( l.array, 'Sort_Callback', l.null ) }>"<MvASSIGNNAME="l.pos"VALUE="{ miva_array_min( l.array ) }>"<MvWHILEEXPR="{ l.pos LE l.max }>"<MvASSIGNNAME="l.array"INDEX="{ l.pos }"MEMBER="a"VALUE=""><MvASSIGNNAME="l.pos"VALUE="{ miva_array_next( l.array, l.pos ) }>"</MvWHILE><MvFUNCTIONRETURNVALUE="{ l.sort }>"</MvFUNCTION><MvFUNCTIONNAME="Sort_Callback"PARAMETERS="left var, right var, data var"STANDARDOUTPUTLEVEL=""><MvIFEXPR="{ l.left LT l.right }>"<MvFUNCTIONRETURNVALUE="-1>"<MvELSEIFEXPR="{ l.left GT l.right }>"<MvFUNCTIONRETURNVALUE="1>"<MvELSE><MvCOMMENT> l.left EQ l.right </MvCOMMENT><MvFUNCTIONRETURNVALUE=""></MvIF></MvFUNCTION><MvASSIGNNAME="l.sort"VALUE="{ Miva_Array_Sort_By( 'price', l.struct ) }>"