In this tutorial we will be learning how to sort a multidimensional array using ASP. The function we will use takes as input an array and the corresponding argument index to sort.
You can create a Bubble Sort algorithm capable of sorting a multidimensional array in classic ASP. In the example below, we create an sql statement that pulls addresses from a city area table. This will give us a list of all distinct area codes from a region. Then, we populate a multidimensional array with the information from the record set. At this step we take the address field and extract the address number. After that we use a simple Bubble Sort algorithm to sort the addresses that belong to the same area code by address name and then by address number.
Example:
 | Code Snippet 1 |
 |
|
Dim mySql, RecordSet, dbConnectionStr
Dim mySql2, RecordSet2
Dim mySql3, RecordSet3
'Set the db Connection string to your application connection string
dbConnectionStr = "Driver={MySQL ODBC 3.51 Driver}; " &_
"Port=3306; " &_
"Server=111.11.00.1; " &_
"uid=testuser; " &_
"pwd=connectionPass; " &_
"database=newDB01; " &_
"OPTION=4;"
if request("streetnumber") = "true" then
mySql = "SELECT distinct areacode FROM citi_areas "
mySql = mySql & "order by areacode, address1"
end if
Set RecordSet = Server.CreateObject("ADODB.RECORDSET")
RecordSet.Open mySql , dbConnectionStr
if not RecordSet.EOF then
do until RecordSet.EOF
'get number of units that belong to the same street
dim adr_group_count : adr_group_count = 0
Set RecordSet2 = Server.CreateObject("ADODB.RECORDSET")
mySql2 = "SELECT count(*) as adr_count FROM citi_areas " &_
" where areacode = '" & RecordSet("areacode") & "' "
RecordSet2.Open mySql2 , dbConnectionStr
if not RecordSet2.EOF then
adr_group_count = RecordSet2("adr_count")
end if
ReDim adrArr(3,adr_group_count) ' size of array has been calculated
Set RecordSet3 = Server.CreateObject("ADODB.RECORDSET")
mySql3 = "SELECT * FROM citi_areas where " &_
"areacode = '" & RecordSet("areacode") & "' "
mySql3 = mySql3 & "order by address1"
RecordSet3.Open mySql3 , dbConnectionStr
'populate array
Dim adrArrCounter : adrArrCounter = 0
if not RecordSet3.EOF then
do until RecordSet3.EOF
adrArr(0,adrArrCounter) = RecordSet3("areacode")
adrArr(1,adrArrCounter) = RecordSet3("account_number")
adrArr(2,adrArrCounter) = RecordSet3("account_resident_name")
'sort field below
Dim addressParts : addressParts = RecordSet3("address1")
'find the street number on the unitnumber DB field
Dim findStreetNumber : findStreetNumber = 0
if trim(addressParts) <> "" then
Dim addressArr, p
addressArr=split(addressParts," ")
For p = 0 to UBound(addressArr)
if IsNumeric(addressArr(p)) then
findStreetNumber = CLNG(addressArr(p))
end if
Next
end if
adrArr(3,adrArrCounter) = findStreetNumber
adrArrCounter = adrArrCounter + 1
RecordSet3.movenext
loop
end if
RecordSet3.close
set RecordSet3 = nothing
'sort array
'Note: we pass the argument 3 as the sort argument
Dim sortedArray
sortedArray = arraySort( adrArr, 3)
'display sorted array by address number
Response.Write("<form name=""sortedArrOptions"" action=""myscript.aspx"">)
Response.Write("<select name=""sortedAddresses"">")
Dim z : z = 0
For z = 0 to UBound(sortedArray ,2)
if trim(sortedArray(0,z)) <> "" then
%>
<option value="<%=sortedArray (0,z)%>" id="a<%=i%>" >
<%=sortedArray (2,z)%></option>
<%
i = i + 1
end if
Next
Response.Write("</select>")
RecordSet.movenext
loop
end if
RecordSet.close
set RecordSet = nothing
'>>>>>>>>>>>>>>>><<<<<<<<<<<<<<
' sort multidimensional array of values
'>>>>>>>>>>>>>>>><<<<<<<<<<<<<<
Function arraySort( arToSort, sortBy)
Dim c, d, e, smallestValue, smallestIndex, tempValue
For c = 0 To uBound( arToSort, 2 ) - 1
smallestValue = CLNG( "0" & arToSort( sortBy, c ))
smallestIndex = c
For d = c + 1 To uBound( arToSort, 2 )
if CLNG("0" & arToSort( sortBy, d )) < smallestValue Then
smallestValue = CLNG( "0" & arToSort( sortBy, d ))
smallestIndex = d
End if
Next
if smallestIndex <> c Then 'swap
For e = 0 To uBound( arToSort, 1 )
tempValue = arToSort( e, smallestIndex )
arToSort( e, smallestIndex ) = arToSort( e, c )
arToSort( e, c ) = tempValue
Next
End if
Next
arraySort = arToSort
End Function
|
|