[PHP] Arrays sorteren op 3 argumenten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Disksoft
  • Registratie: September 2003
  • Laatst online: 09-09 23:17
Hallo,

Ik ben bezig met een foto album maar ik krijg iets niet voor elkaar.
Ik heb me mappen zo opgelagen 2004-01-03 Naam map1, 2004-12-24 Naam map2, 2003-01-01 Naam map3

Wat ik wil is dat die kijkt welke jaartallen in de map zitten (bijv 2002 tot 2005) Dat die dan tabellen aanmaakt van 2002 t/m 2005.
En dat die dan de fotos van jan t/m dec plaats van dat jaar in volgorde van jan/dec en op de dan nr 01/31

Bijvoorbeeld
[tabel 2004]
Naam map1
Naam map2

[tabel 2003]
Naam map3

Ik had gedacht het met arrays te doen maar ik kom er helemaal niet uit ik krijg totaal geen goede output waarmee ik iets kan creeërn. Ik heb het volgende script:

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
<?php 
$handle = opendir('fotos'); 
$data = array(); 

while (false !== ($file = readdir($handle))) { 
    if ($file != "." && $file != "..") { 
        list($datum) = explode(' ', $file); 
        list($jaar, $maand, $dag) = explode('-', $datum); 
        $data[$file] = mktime(0,0,0,$maand, $dag, $jaar); 
    } 
} 

closedir($handle); 

// print_r($data);
sort($data); 

$mapnamen = array_keys($data); 
print_r($data);

for($i=0, $j=count($mapnamen); $i<$j; $i++) { 
    $mapnaam = $mapnamen[$i]; 
        print_r($mapnamen)."<br>";
} 
?>


Wie kan mij helpen? Ik heb nog nooit echt uitgebreid met Arrays gewerkt.
En al helemaal nooit Arrays gesplist en gesorteerd.

Met vriendelijke groet,
Robbert van den Berg

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Als je de data uit de database haalt, dan kun je het ook gesorteerd ophalen. Kijk dan bijvoorbeeld eens naar de ORDER BY clause. Die accepteerd ook meerdere argumenten. Anders zou je eens kunnen kijken naar diverse sorteer algoritmen (bubblesort is een vrij simpele) en die naar eigen wens toepassen, of je zou kunnen kijken naar de php functies sort() of ksort() oid.

[ Voor 11% gewijzigd door Michali op 29-07-2005 15:20 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Disksoft
  • Registratie: September 2003
  • Laatst online: 09-09 23:17
Ik ben al 3 dagen aan het klooien er mee maar ik kom er echt niet uit en ik wil het niet via een database laten lopen maar gewoon als ik een map er in upload dat die de rest automatisch doet.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik had ff je post niet helemaal goed gelezen sorry. Ik zie dat je al gebruik maakt van sort().

Je zou ook iets in deze richting kunnen doen:
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
33
34
35
36
37
38
39
40
41
<?php 

$handle = opendir('fotos'); 
$data = array(); 
while (false !== ($file = readdir($handle))) { 
    if ($file != "." && $file != "..") { 
        list($datum) = explode(' ', $file); 
        list($jaar, $maand, $dag) = explode('-', $datum); 
        if ( !isset($data[$jaar]) ) $data[$jaar] = array();
        if ( !isset($data[$jaar][$maand]) ) $data[$jaar][$maand] = array();
        if ( !isset($data[$jaar][$maand][$dag]) ) $data[$jaar][$maand][$dag] = array();
        $data[$jaar][$maand][$dag][] = $file;
    } 
} 
closedir($handle); 

ksort($data); 
foreach ( $data as $year => $months )
{
    print "<table>";
    print "<caption>Mappen in jaar " . $year . "</caption>";
    print "<thead><tr><th>Datum</th><th>Naam</th></tr></thead>";
    print "<tbody>";
    ksort($months);
    foreach ( $months as $month => $days )
    {
        ksort($days);
        foreach ( $days as $day => $maps )
        {
            sort($maps);
            foreach ( $maps as $map )
            {
                print "<tr><td>" . $month . "/" . $day . "</td><td>" . $map . "</td></tr>";
            }
        }
    }
    print "</tbody>";
    print "</table>";
}

?>

Niet getest overigens.

Edit: ff die tabel erbij gedaan, dan zie je hoe je dat kunt oplossen.

[ Voor 34% gewijzigd door Michali op 29-07-2005 15:37 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Robbert_berg schreef op vrijdag 29 juli 2005 @ 15:20:
Ik ben al 3 dagen aan het klooien er mee maar ik kom er echt niet uit en ik wil het niet via een database laten lopen maar gewoon als ik een map er in upload dat die de rest automatisch doet.
Wat heb je dan al allemaal geprobeerd? Wat lukte daar niet mee? Kreeg je andere output dan je verwachte? Krijg je misschien foutmeldingen? Zie ook P&W FAQ - De "quickstart"

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Disksoft
  • Registratie: September 2003
  • Laatst online: 09-09 23:17
Ik heb nu dit:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php

$handle =opendir(".");
$dir_list =array( );

while( $file = readdir($handle) )
{
    if( $file == ".." || $file == "." )
        continue;

    if( !is_dir( $file ) )
        continue;

    $dirname =array( );
    $dirname = explode( ' ', $file );

    $date =$dirname[0];
    
    $vals =count( $dirname );
    for( $i =1; $i < $vals; $i++ )
    {
        if( $i == 1 )
            $name =$dirname[1];
        else
            $name = $name . " ". $dirname[$i];
    }

    list( $year, $month, $day ) = explode( '-', $date );
    
    $dir_list[$year][$month][$day][$name] =$name;

}


end( $dir_list );

$year =array( );

do
{
    $year =current( $dir_list );
    $cur_year =key( $dir_list );
    echo "$cur_year<br><blockquote>";
    
    $month =array( );
    do
    {
        $month =current( $year );
        $cur_month =key( $year );
        echo "$cur_month<br><blockquote>";
        
        $day =array( );
        do
        {
            $day =current( $month );
            $cur_day =key( $month );
            echo "$cur_day<br><blockquote>";

            do
            {
                $title =current( $day );
                echo "$title<br>";
            }
            while( next( $day ) );
            echo "</blockquote>";
        
        }
        while( next( $month ) );
        echo "</blockquote>";
    }
    while( next( $year ) );
    echo "</blockquote>";
    
}
while( prev( $dir_list ) );


?>


Hier kan ik nu wat mee met deze output alleen nu wil ik weten of dit kleiner kan...
Het werkt wel dus dat is het probleem niet meer (hier kan ik wat mee!).

Kan het kleiner zo ja hoe?

De echos moet je ff niet opletten het wordt straks template power

Mvg
Robbert

[ Voor 22% gewijzigd door Disksoft op 29-07-2005 18:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je bij het inlezen van de bestanden nou eens een array maakt als volgt:

PHP:
1
$lijst[$jaar].=array('datum' => $datum, 'mapnaam' => $mapnaam)


Dan krijg je een $lijst met unieke jaartallen, die kun je sorteren. De arrays van elk jaartal kun je ook sorteren op de datum key en ze vertellen je ook gelijk de mapnaam.
Pagina: 1