Autor Zpráva
king26
Profil
Ahoj,
potýkám se s drobným problémem. Vytahuji z MySQL data a potřebuji je seřadit dle IP adresy (uložena jako STRING). Řazení funguje dobře, funguje dobře na STRING. Já ale IP adresy potřebuji řadit jako INTEGER. (tzn. 192.168.2.23 musí být až za 192.168.2.4).

Výběr z databáze:
$vysilac_into_q=mysql_query("SELECT v.*, z.id AS z_id, z.nazev AS z_nazev, z.stroj, z.graf, z.snmp, z.ping, ip.ip, s.id AS s_id, s.nazev AS s_nazev FROM vysilac v LEFT JOIN zarizeni z ON z.id_vys=v.id LEFT JOIN ip ON (ip.id_user=z.id AND ip.type='4') LEFT JOIN ssid s ON (s.id_vys=v.id AND s.id_zar=z.id) WHERE v.id = '".$vys_id."' ORDER BY ip.ip ASC, s.nazev ASC");


Naházení dat do pole:
while($vysilac_into_row=mysql_fetch_assoc($vysilac_into_q)) {
    if(!isset($vysilac_a['id'])) {
        $vysilac_a=array(
            'id'=>$vysilac_into_row['id'],
            'nazev'=>htmlspecialchars($vysilac_into_row['nazev']),
            'adr_ulice'=>htmlspecialchars($vysilac_into_row['adr_ulice']),
            'adr_cp'=>htmlspecialchars($vysilac_into_row['adr_cp']),
            'adr_mesto'=>htmlspecialchars($vysilac_into_row['adr_mesto']),
            'adr_psc'=>$vysilac_into_row['adr_psc'],
            'zarizeni'=>array()
        );
    }
    if(!isset($vysilac_a['zarizeni'][$vysilac_into_row['z_id']])&&$vysilac_into_row['z_id']>0) {
        $vysilac_a['zarizeni'][$vysilac_into_row['z_id']]=array(
            'nazev'=>htmlspecialchars($vysilac_into_row['z_nazev']),
            'stroj'=>htmlspecialchars($vysilac_into_row['stroj']),
            'graf'=>$vysilac_into_row['graf'],
            'snmp'=>htmlspecialchars($vysilac_into_row['snmp']),
            'ping'=>$vysilac_into_row['ping'],
            'ip'=>$vysilac_into_row['ip'],
            'ssid'=>array()
        );
    }
    if(!isset($vysilac_a['zarizeni'][$vysilac_into_row['z_id']]['ssid'][$vysilac_into_row['s_id']])&&$vysilac_into_row['s_id']>0) {
        $vysilac_a['zarizeni'][$vysilac_into_row['z_id']]['ssid'][$vysilac_into_row['s_id']]=htmlspecialchars($vysilac_into_row['s_nazev']);
    }
}


Řazení standardními php funkcemi zřejmě nepřipadá v úvahu (zkoušel jsem :) ). Poradil by mě někdo, jak tento problém vyřešit?

Děkuji.
Keeehi
Profil
- Ukládat do DB jako integer (4 sloupce).
- Kratší (jedno a dvojčíselné části) doplnit nulami 192.168.2.23 => 192.168.002.023 pak bude řazení jako string fungovat.
- Jsem si jistý, že by to šlo řadit i v PHP. V nejhorším případě funkcí usort.
panther
Profil
Keeehi:
- Ukládat do DB jako integer (4 sloupce).
toto není dobré řešení, to bych tu snad ani nezveřejňoval :-)
Keeehi
Profil
panther:
Připouštím, že vypadá i poněkud divně, avšak když teď o tom přemýšlím, nějak mě nenapadá pořádný důvod, čemu to vlastně tolik vadí? Docela by mě to zajímalo.
king26
Profil
Keeehi:
Připouštím, že vypadá i poněkud divně, avšak když teď o tom přemýšlím, nějak mě nenapadá pořádný důvod, čemu to vlastně tolik vadí? Docela by mě to zajímalo.
Vzhledem k tomu, že potřebuji zajistit unikátnost IP adres v databázi a podobné věci, toto řešení je prostě strašně krkolomné..

Kratší (jedno a dvojčíselné části) doplnit nulami 192.168.2.23 => 192.168.002.023 pak bude řazení jako string fungovat.
Taky celkem neefektivní řešení. Viděl jsi někdy uvádět takovýto tvar IP? A převádět to pokaždé, když chci IP vypsat/uložit z/do DB je taktéž kravina.

Jsem si jistý, že by to šlo řadit i v PHP. V nejhorším případě funkcí usort.
Jdu se na to podívat, snad mě to s touto funkcí půjde. :)
king26
Profil
Krkolomné, leč zřejmě účinné řešení:
function GetArraySortByIP($a,$b) {
    $ip_a=explode(".",$a['ip']);
    $ip_b=explode(".",$b['ip']);
    if($ip_a[0]==$ip_b[0]) {
        if($ip_a[1]==$ip_b[1]) {
            if($ip_a[2]==$ip_b[2]) {
                if($ip_a[3]==$ip_b[3]) return 0;
                else return ($ip_a[3]<$ip_b[3])?-1:1;
            } else return ($ip_a[2]<$ip_b[2])?-1:1;
        } else return ($ip_a[1]<$ip_b[1])?-1:1;
    } else return ($ip_a[0]<$ip_b[0])?-1:1;
}
uasort($vysilac_a['zarizeni'],"GetArraySortByIP");


Díky Keeehimu za nakopnutí!


EDIT: funkce usort změní hodnoty klíčů, takže je potřeba použít fci uasort
Keeehi
Profil
king26:
unikátnost IP adres
Tak to mi uniklo, tady by problémy nastávali. Ještě někde?
PostCC
Profil
king26:
Nevím, zda jste obeznámeni s funkcemi MySQL INET_ATON() a INET_NTOA(). Slouží přesně k tomu, co hledáte - k převodu tečkové notace IPv4 adresy na integer. Doporučuji tedy ukládat IP adresu do sloupce INT UNSIGNED pomocí např.:

INSERT Table (Ip) VALUES (INET_ATON('127.0.0.1'))


pro čtení pak např.:

SELECT INET_NTOA(Ip) AS IpFormated FROM Table ORDER BY Ip

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: