[PHP] Array sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een website aan het maken waarop ik mijn fotos kan tonen. Daarvoor heb ik een script gemaakt die alle fotos in een bepaalde map opzoekt, in een array stopt en vervolgens op de pagina de fotos van een bepaalde categorie/map weergeeft:
PHP:
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
$extensions = array("jpg", "gif", "png");
$images = array();

// Fotos uit opgegeven map in array zetten ($dir = path $file = bestandsnaam).
function findimages($dir)   {

global $extensions;
$images = array();

    if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
                    if($file != "." && $file != ".." && !is_dir($file) && in_array(substr($file, -3), $extensions) && substr($file, 0, 2) == "t_") {
                    $images[] = array($dir, $file);
                    }
        }
        closedir($dh);
    }
    }
    return $images;
}

// Fotos van bepaalde categorie uit array findimages() halen en printen
function loadImg($cat) {
    
$images = findimages("work/$cat/");

    foreach($images as $picture) {
        $img = $picture[0] . $picture[1];
        print("<div class=\"thumb\"><a href=\"$picture[0]". substr($picture[1], 2) . "\" rel=\"lightbox[$cat]\" title=\"Copyright &copy; 2008 Niels Vos. All Rights Reserved.\"><img class=\"random\" src=\"$img\" alt=\"Copyright &copy; 2008 Niels Vos. All Rights Reserved.\" /></a></div>");
    }
}


Op dit moment geeft het script de fotos in een (ogenschijnlijk) willekeurige volgorde weer. Ik wil graag dat hij de array $images soorteert op alfabetische volgorde.

Het probleem is dat de array weer arrays bevat. Een print_r ($images); geeft dit als resultaat:

Array ( [0] =>
Array ( [0] => work/nature/ [1] => t_nat2.jpg ) [1] =>
Array ( [0] => work/nature/ [1] => t_nat4.jpg ) [2] =>
Array ( [0] => work/nature/ [1] => t_nat1.jpg ) [3] =>
Array ( [0] => work/nature/ [1] => t_nat5.jpg ) [4] =>
Array ( [0] => work/nature/ [1] => t_nat3.jpg ) )

Wat ik dus wil is de bestandsnamen (t_natX.jpg) in de array sorteren op alfabetische volgorde.
Heeft iemand een idee hoe ik dit aan kan pakken?

Acties:
  • 0 Henk 'm!

Verwijderd

Stop eerst alle namen in een array, sorteer de array. De directory is voor elke file hetzelfde, en ook buiten de functie bekend. Dus waarom zou je in vredesnaam de directory ook in de return array zetten?

En anders nog. Je zou ook $images[] = $dir . $file kunnen doen, en dan die array sorteren. Werkt net zo goed.

Als je later nog de losse bestandsnaam nodig hebt, kun je dat eventueel nog met basename doen.

[ Voor 13% gewijzigd door Verwijderd op 19-04-2008 17:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De directory is afhankelijk vanaf welke pagina het script opgevraagd wordt. Bovendien gebruik ik dezelfde array nog in een ander script. Dus ik heb het wel op deze manier nodig.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok ik denk dat ik het toch heb gevonden, als ik gewoon deze functie gebruik:
PHP:
1
2
3
4
5
6
7
8
9
10
function loadImg($cat) {
    
$images = findimages("work/$cat/");
[b]arsort($images);[/b]

    foreach($images as $picture) {
        $img = $picture[0] . $picture[1];
        print("<div class=\"thumb\"><a href=\"$picture[0]". substr($picture[1], 2) . "\" rel=\"lightbox[$cat]\" title=\"Copyright &copy; 2008 Niels Vos. All Rights Reserved.\"><img class=\"random\" src=\"$img\" alt=\"Copyright &copy; 2008 Niels Vos. All Rights Reserved.\" /></a></div>");
    }
}

Op deze manier werkt het zoals ik het wil. (wil het ook in omgekeerde volgorde).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik vind het nog steeds een domme manier om zoiets te doen.

De code die die functie aanroept moet de directory als argument aan je findimages functie meegeven. Die directory is dus al buiten de functie bekend. Hoef je hem ook niet meer 60 keer in een array te zetten (hij is écht voor elke entry uit dezelfde directory hetzelfde) en te returnen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Eens met Cheatah. Gebruik aub voortaan [php][/php] tags om je php code, want dit leest rot. ;)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok sorry daarvoor, ik zat al te zoeken naar een knopje om code weer te geven :)

Maar bedoelen jullie dan eigenlijk dat ik in de code

$images[] = array($dir, $file);

moet veranderen in

$images[] = array($file);

?

Acties:
  • 0 Henk 'm!

Verwijderd

$images [] = $file;

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok bedankt! Het werkt zo inderdaad ook! Maar nu kwam ik er ook meteen achter waarom ik de array erin had, ik heb namelijk ook de volgende functie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function randomImg()    {

    $cat1 = findimages("work/architecture/");
    $cat2 = findimages("work/industrial/");
    $cat3 = findimages("work/landscapes/");
    $cat4 = findimages("work/nature/");
    $cat5 = findimages("work/stillsandobjects/");
    $cat6 = findimages("work/hdr/");
    
    $aap = array_merge($cat1, $cat2, $cat3, $cat4, $cat5, $cat6);
    $id = $aap[rand(0, sizeof($aap) - 1)];
    $img = $id[0] . $id[1];
    
    print("<div class=\"thumbhome\"><div class=\"thumb\"><a href=\"$id[0]". substr($id[1], 2) . "\" rel=\"lightbox[randomart]\" title=\"Copyright &copy; 2008 Niels Vos. All Rights Reserved.\"><img src=\"$img\" alt=\"Random Photo\" /></a></div></div>");
}
?>


Die genereerd een random image, en dan is de directory wel weer afhankelijk van de random getrokken bestandsnaam.
Kan ik dat nog nifty oplossen? Of kan ik in dat geval beter bij mijn vorige manier blijven?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Kies gewoon een random categorie en dan uit die categorie een random image. Scheelt meteen 5/6e aan disk i/o acties.

Overigens krijg ik behoorlijke jeuk van variabelenamen als cat1 t/m cat6. Doe dat ook dynamisch dmv en array, minder werk om te onderhouden als er een categorie bij komt.

[ Voor 43% gewijzigd door Voutloos op 19-04-2008 22:29 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hehe ok, ik ben tamelijk nieuw met dit soort dingen ;) Echt slim programmeren kan ik nog niet, ik kijk voorbeelden en probeer die naar mijn smaak aan te passen.

Ik ga iig aan de slag met jullie tips, bedankt!
Pagina: 1