Je souhaite pouvoir ordonner un tableau contenant des adresses IP.
Je suis en train de regarder différents UDF (ArrayMultiSortCase, arrayplus, ...) sans réellement trouver mon bonheur.
J'ai codé mon propre algo mais je souhaiterais savoir si une solution existe déjà.
#include <Array.au3>
Main()
Func Main()
Local $aIP = [['Nom', 'IP'], ['riri', '192.168.30.4'], ['fifi', '192.168.120.10'], ['loulou', '10.5.250.5'], ['toto', '192.168.4.45']]
; Test 2D
Local $a2D = $aIP
_ArrayDisplay($a2D, 'initial')
SortIP($a2D, 0, 1, 0, 1)
_ArrayDisplay($a2D, 'ordered')
; Test 1D
Local $a1D = $aIP
_ArrayColDelete($a1D, 0, True) ; suppression colonne 0
_ArrayDelete($a1D, 0) ; suppression ligne 0
_ArrayDisplay($a1D, 'initial')
SortIP($a1D)
_ArrayDisplay($a1D, 'ordered')
EndFunc ;==>Main
Func SortIP(ByRef $aArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
Local $aRegExp[0]
Local $iColOrder = 1
If $iEnd = 0 Then $iEnd = UBound($aArray) - 1
Switch UBound($aArray, $UBOUND_DIMENSIONS)
Case 1 ; 1D array
_ArrayColInsert($aArray, 1)
For $iItem = $iStart To $iEnd
$aRegExp = StringRegExp($aArray[$iItem][$iSubItem], '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})', $STR_REGEXPARRAYGLOBALMATCH)
If @error = 0 Then $aArray[$iItem][$iColOrder] = $aRegExp[0] * 1000000000 + $aRegExp[1] * 1000000 + $aRegExp[2] * 1000 + $aRegExp[3]
Next
Case 2 ; 2D array
$iColOrder = UBound($aArray, $UBOUND_COLUMNS)
ReDim $aArray[$iEnd + 1][$iColOrder + 1]
For $iItem = $iStart To $iEnd
$aRegExp = StringRegExp($aArray[$iItem][$iSubItem], '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})', $STR_REGEXPARRAYGLOBALMATCH)
If @error = 0 Then $aArray[$iItem][$iColOrder] = $aRegExp[0] * 1000000000 + $aRegExp[1] * 1000000 + $aRegExp[2] * 1000 + $aRegExp[3]
Next
EndSwitch
_ArraySort($aArray, $iDescending, $iStart, $iEnd, $iColOrder)
_ArrayColDelete($aArray, $iColOrder)
EndFunc ;==>SortIP
Main()
Func Main()
Local $aIP = [['Nom', 'IP'], ['riri', '192.168.30.4'], ['fifi', '192.168.120.10'], ['loulou', '10.5.250.5'], ['toto', '192.168.4.45']]
; Test 2D
Local $a2D = $aIP
_ArrayDisplay($a2D, 'initial')
SortIP($a2D, 0, 1, 0, 1)
_ArrayDisplay($a2D, 'ordered')
; Test 1D
Local $a1D = $aIP
_ArrayColDelete($a1D, 0, True) ; suppression colonne 0
_ArrayDelete($a1D, 0) ; suppression ligne 0
_ArrayDisplay($a1D, 'initial')
SortIP($a1D)
_ArrayDisplay($a1D, 'ordered')
EndFunc ;==>Main
Func SortIP(ByRef $aArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
Local $aRegExp[0]
Local $iColOrder = 1
If $iEnd = 0 Then $iEnd = UBound($aArray) - 1
Switch UBound($aArray, $UBOUND_DIMENSIONS)
Case 1 ; 1D array
_ArrayColInsert($aArray, 1)
For $iItem = $iStart To $iEnd
$aRegExp = StringRegExp($aArray[$iItem][$iSubItem], '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})', $STR_REGEXPARRAYGLOBALMATCH)
If @error = 0 Then $aArray[$iItem][$iColOrder] = $aRegExp[0] * 1000000000 + $aRegExp[1] * 1000000 + $aRegExp[2] * 1000 + $aRegExp[3]
Next
Case 2 ; 2D array
$iColOrder = UBound($aArray, $UBOUND_COLUMNS)
ReDim $aArray[$iEnd + 1][$iColOrder + 1]
For $iItem = $iStart To $iEnd
$aRegExp = StringRegExp($aArray[$iItem][$iSubItem], '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})', $STR_REGEXPARRAYGLOBALMATCH)
If @error = 0 Then $aArray[$iItem][$iColOrder] = $aRegExp[0] * 1000000000 + $aRegExp[1] * 1000000 + $aRegExp[2] * 1000 + $aRegExp[3]
Next
EndSwitch
_ArraySort($aArray, $iDescending, $iStart, $iEnd, $iColOrder)
_ArrayColDelete($aArray, $iColOrder)
EndFunc ;==>SortIP
Question subsidiaire : je souhaite effectuer la même opération sur les données d'une ListView.
Il me semblait avoir vu passer une fonction qui permet d'ordonner en renvoyant chaque donnée vers une sous-fonction (Callback). Mais je ne la retrouve plus.
L'UDF _GUIListViewEx propose la fonction _GUIListViewEx_ReadToArray() mais je préfèrerais éviter d'utiliser cette usine à gaz pour ce simple besoin.