2013-08-11 10 views
6

Sto costruendo un gestore di interruttore su misura per il lavoro, il mio problema attuale è più un estetico ma penso che sia una buona esperienza di apprendimento. Ho inviato la matrice di seguito per chiarezza:PHP doppia sorta serie sulla base di sottostringa

Array 
(
    [1] => FastEthernet0/1 
    [10] => FastEthernet0/10 
    [11] => FastEthernet0/11 
    [12] => FastEthernet0/12 
    [13] => FastEthernet0/13 
    [14] => FastEthernet0/14 
    [15] => FastEthernet0/15 
    [16] => FastEthernet0/16 
    [17] => FastEthernet0/17 
    [18] => FastEthernet0/18 
    [19] => FastEthernet0/19 
    [2] => FastEthernet0/2 
    [20] => FastEthernet0/20 
    [21] => FastEthernet0/21 
    [22] => FastEthernet0/22 
    [23] => FastEthernet0/23 
    [24] => FastEthernet0/24 
    [3] => FastEthernet0/3 
    [4] => FastEthernet0/4 
    [5] => FastEthernet0/5 
    [6] => FastEthernet0/6 
    [7] => FastEthernet0/7 
    [8] => FastEthernet0/8 
    [9] => FastEthernet0/9 
    [25] => Null0 
) 

Sui nostri interruttori più grandi che sto usando asort($arr); per ottenere GigabitEthernet1/1 a venire prima di 2/1, ecc ...

Il mio obiettivo è quello di ordinamento il numero di interfaccia (parte dopo '/') in modo che 1/8 venga prima dell'1/10.

Qualcuno potrebbe indicarmi la direzione giusta, voglio lavorare per i risultati ma non conosco abbastanza bene con PHP per sapere esattamente dove andare.

Note: passa fuori più grande multi-modulo gli ID non sono in ordine così una sorta su $ arr [key] non funzionerà.

risposta

6

È possibile utilizzare il flag durante l'utilizzo asort(), come qui di seguito.

asort($arr, SORT_NATURAL | SORT_FLAG_CASE);print_r($arr); 

Si stamperà/ordinare i dati come yo bisogno.

+0

questo ha funzionato perfettamente. Ora per cercare il significato. – xandout

2

Il SORT_NATURAL e SORT_FLAG_CASE richiede V5.4 +.

Se stai usando una vecchia versione di PHP, è possibile farlo con uasort e una funzione di confronto personalizzato di callback.

$interfaces = array(...); 
$ifmaj = array(); 
$ifmin = array(); 
$if_cmp = function ($a, $b) { 
    list($amaj,$amin) = split('/',$a); 
    list($bmaj,$bmin) = split('/',$b); 
    $maj = strcmp($amaj,$bmaj); 
    if ($maj!=0) return $maj; 
    //Assuming right side is an int 
    return $amin-$bmin; 
}; 
uasort($interfaces, $if_cmp);