[PHP] Sorteren van array elementen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Ik heb een functie gemaakt die een array aanmaakt van een directory die uit wordt gelezen.

Nu is de output als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    [1] => Array
        (
            [filename] => 49.exe
            [size] => 18249023
            [changedate] => 09/20/2003
        )

    [2] => Array
        (
            [filename] => AccessRT.exe
            [size] => 28727238
            [changedate] => 09/22/2003
        )

    [3] => Array
        (
            [filename] => adaware.rar
            [size] => 2854441
            [changedate] => 11/15/2003
        )


Werkt allemaal leuk en aardig. Alleen nu zou ik graag wil sorteren op filename, size of changedate.

Ik dacht zelf aan de functie uksort (http://nl.php.net/manual/nl/function.uksort.php)

Alleen snap ik niet precies hoe die te werk gaat. Nu kan ik wel 3 aparte arrays weer aanmaken en die sorteren. Maar dat is meer symptoonbestreiding. Er is ongetwijfeld een handigere manier.

Kan iemand me een eindje verder helpen?

[ Voor 11% gewijzigd door me1299 op 17-11-2003 15:38 ]

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Met de uksort kan je zelf een functie maken die aangeeft of het groter of kleiner is dan de opgegeven kriterium. Denk niet dat dit in jouw geval de oplossing is.

Ook qua array structuur kan je het niet eventjes oplossen met een multisort.

Wat ik zelf in een soortgelijk geval heb gedaan is een functie gemaakt die per kolom door de array heen kan loopen en een tweede array op de zoekcriteria maakt, deze sorteren en dan dus weer in die volgorde de array op te bouwen en terug sturen. :)

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

Je moet uasort gebruiken ipv uksort , je zal zelf een functie moeten schrijven waarin je vegelijkt. Omdat je de keuze wilt hebben uit de kolom zal je deze dmv een global oid mee moeten geven. Je krijgt dan ongeveer het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
function cmp($a, $b)
{
  global $sKolom;

 return strcmp($a[$sKolom], $b[$sKolom]);
}

$a = array( waarden);

$sKolom = 'filename';
uasort($a, "cmp");


Voor je andere kolommen spreekt het neem ik aan voor zich hoe je ze moet vergelijken.
volgens mij doet strcmp tenminste precies hetgeen je wilt doen met het vergelijken van de filenames

[ Voor 10% gewijzigd door Verwijderd op 17-11-2003 16:08 . Reden: moet natuurlijk uasort zijn ipv uksort ]


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Verwijderd schreef op 17 november 2003 @ 16:05:
Je moet uasort gebruiken ipv uksort , je zal zelf een functie moeten schrijven waarin je vegelijkt. Omdat je de keuze wilt hebben uit de kolom zal je deze dmv een global oid mee moeten geven. Je krijgt dan ongeveer het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
function cmp($a, $b)
{
  global $sKolom;

 return strcmp($a[$sKolom], $b[$sKolom]);
}

$a = array( waarden);

$sKolom = 'filename';
uasort($a, "cmp");


Voor je andere kolommen spreekt het neem ik aan voor zich hoe je ze moet vergelijken.
volgens mij doet strcmp tenminste precies hetgeen je wilt doen met het vergelijken van de filenames
Ik heb je functie geprobeerd alleen zonder succes. Er wordt nu wel iets gesorteerd, maar de volgorde is totaal onlogisch.

Code

Functie om array aan te maken

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function scandir($dirstr) {
    $files = array();
    $fh = opendir($dirstr);

    $count = 0;

    while(false !== ($filename = readdir($fh))) {
        if($filename != "." && $filename != "..") {
            $count++;

            $files[$count]['filename'] = $filename;
            $files[$count]['size'] = filesize($dirstr. $filename);
            $files[$count]['changedate'] = filectime($dirstr. $filename);
        }
    }

    closedir($fh);

    return $files;
}


Poging om te sorteren op grootte:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$dir_array = scandir(setting("files_path"));

if($_GET['sort']) {
    if($_GET['sort'] == "size") {

        function cmp($a, $b) {
            global $sKolom;
            return strcmp($a[$sKolom], $b[$sKolom]);
        }

        $sKolom = 'size';
        uasort($dir_array, "cmp");
    }

    print_r($dir_array);
}


Een stukje output:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    [8] => Array
        (
            [filename] => MyCosmicLover.mp3
            [size] => 13021603
            [changedate] => 1067784491
        )

    [22] => Array
        (
            [filename] => WinRarSilent.exe
            [size] => 1354628
            [changedate] => 1067421801
        )

    [14] => Array
        (
            [filename] => SETUP.CFG
            [size] => 1368
            [changedate] => 1064055306
        )

    [1] => Array
        (
            [filename] => 49.exe
            [size] => 18249023
            [changedate] => 1064055291
        )

    [24] => Array
        (
            [filename] => wms.exe
            [size] => 1956633
            [changedate] => 1064055307
        )

    [9] => Array
        (
            [filename] => nero.rar
            [size] => 21929041
            [changedate] => 1068546474
        )


De array is zoals je ziet niet gesorteerd op grootte maar wel veranderd van volgorde :?

[ Voor 18% gewijzigd door me1299 op 17-11-2003 16:37 ]

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PHP:
1
2
3
4
5
6
7
function aasort($x,$var,$cmp='strcasecmp'){
    if ( is_string($var) ) $var = "'$var'";
    uasort($x,create_function('$a,$b', 'return '.$cmp.'( $a['.$var.'],$b['.$var.']);'));
    return $x;
}

$sorted=aasort($dir_array,'filename');


De eerste parameter van de functie is de 'hoofdarray', de tweede de subkey waarop je wilt sorteren en de derde (optionele) parameter de compare functie. Standaard dus een stringcompare. Maar je kunt ook zelf ander functies opgeven/maken/gebruiken.

Klein (simpel) voorbeeldje:
PHP:
1
2
3
4
5
function intcompare($a,$b){ 
    if (intval($a) > intval($b)) { return(1); }
    if (intval($a) < intval($b)) { return(-1); }
    if (intval($a) == intval($b)) { return(0); }
}

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
beetle71 schreef op 17 november 2003 @ 16:46:
PHP:
1
2
3
4
5
6
7
function aasort($x,$var,$cmp='strcasecmp'){
    if ( is_string($var) ) $var = "'$var'";
    uasort($x,create_function('$a,$b', 'return '.$cmp.'( $a['.$var.'],$b['.$var.']);'));
    return $x;
}

$sorted=aasort($dir_array,'filename');


De eerste parameter van de functie is de 'hoofdarray', de tweede de subkey waarop je wilt sorteren en de derde (optionele) parameter de compare functie. Standaard dus een stringcompare. Maar je kunt ook zelf ander functies opgeven/maken/gebruiken.

Klein (simpel) voorbeeldje:
PHP:
1
2
3
4
5
function intcompare($a,$b){ 
    if (intval($a) > intval($b)) { return(1); }
    if (intval($a) < intval($b)) { return(-1); }
    if (intval($a) == intval($b)) { return(0); }
}
_/-\o_

Werkt subliem! Kan er eigenlijk nix meer over zeggen. Behalve heel erg bedankt!

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-08 12:04

WormLord

Devver

DeathKnight schreef op 17 november 2003 @ 16:33:
[...]


Ik heb je functie geprobeerd alleen zonder succes. Er wordt nu wel iets gesorteerd, maar de volgorde is totaal onlogisch.

Code
[...]

De array is zoals je ziet niet gesorteerd op grootte maar wel veranderd van volgorde :?
Dat komt omdat de grootte wordt gesorteerd alsof het een string is i.p.v. een integer, en dan is 19 groter dan 1298.
Pagina: 1