Avatar billede perh Juniormester
28. juni 2010 - 00:43 Der er 14 kommentarer og
1 løsning

sortering

Jeg kan ikke finde ud af at få sorteret linjerne i denne dropdown.
Den lister foldere, som hedder f. eks: 2010-06-24; 2010-06-26; osv Kan nogen her hjælpe?


while(false !== ($subs = readdir($root))) {
if(filetype($subs) == "dir") {
if($subs != "." && $subs != "..") {
if($subs == $selected) {
$sel = " selected";
} else {
$sel = "";
}
echo '<option'.$sel.' value="'.$subs.'">'.$subs.'</option>'."\n";
}
}
}
echo '</select>';
}
Avatar billede perh Juniormester
28. juni 2010 - 00:44 #1
Jeg vil gerne have dem sorteret så de nyeste datoer står øverst
Avatar billede The_Buzz Novice
28. juni 2010 - 07:34 #2
Må indrømme jeg blev nødt til at google det:

<?
$path = 'images';
# Initialise list arrays, files and array counters for them
$t = 0;
$f = 0;
$images_arr['name'] = array();
$images_arr['time'] = array();
if (@$handle = opendir($path)) {
while (false!== ($file = readdir($handle))) {
if($file!= "." && $file!= "..") {
$fName = $file;
$file = $path.'/'.$file;
if(is_file($file)){
$images_arr['time'][$t++] = filemtime($file); //<---- here it is, just a seperate key in the array to store filetimes
$images_arr['name'][$f++] = $file;
};
};
};
closedir($handle);
asort( $images_arr['time'] );
asort( $images_arr['name'] );
}

//test
foreach ($images_arr['time'] as $key=>$ftime){
$fname = $images_arr['name'][$key];
echo '<strong>filename:</strong> '.$fname.' <strong>filetime:</strong> '.$ftime.'<br/>';
}?>

Source: http://www.webmasterworld.com/forum88/10156.htm
Avatar billede showsource Seniormester
28. juni 2010 - 07:35 #3
Du er nødt til at lave et array først, sortere det som du gerne vil, og derefter bruge det i en select.
Avatar billede The_Buzz Novice
28. juni 2010 - 07:35 #4
Det der sker er at den smider filename info ind i et array og derefter sorterer asort array efter time.

Det er muligt du skal kommentere
asort( $images_arr['name'] );
ud for at få den til at sortere efter time.
Avatar billede showsource Seniormester
28. juni 2010 - 08:19 #5
Når nu dirs har navn som 2010-06-24, 2010-06-27 o.s.v. behøves der jo ikke filemtime.
Et andet ex.

<?php

$path = "images";

$folders = array();

$handle = opendir($path);

while(false !== ($dirs = readdir($handle))) {

$dirpath = $path."/".$dirs;

    if(is_dir($dirpath)) {

        if($dirs == "." || $dirs == "..") {
        continue;
        }

    $folders[] = $dirs;

    }


}

echo"<pre>";

print_r($folders);

arsort($folders);

print_r($folders);

echo"</pre>";

?>
Avatar billede perh Juniormester
28. juni 2010 - 16:50 #6
Tak for de gode forslag. Jeg kan nu se, hvordan det skal gøres. Jeg bakser lidt videre med det, og regner med at kunne sortere filerne også.
Det er rigtigt, at jeg ikke behøver filetime, da folderne har entydige navne mht sortering efter dato, filerne er ligeledes med fortløbende numre (fotos), men filetime er vel den mere korrekte måde, dog lidt afhængig af, hvordan upload fra mobil router forløber - om de uploades i mere tilfældig orden, for så sorterer jeg efter filnavn..

Jeg vender tilbage med point, når jeg har afprøvet det og bestemt mig til måden at gøre det på.
Avatar billede jantzen88 Nybegynder
28. juni 2010 - 18:03 #7
<?php
$path = "images";
$folders = glob($path,GLOB_ONLYDIR);
arsort($folders);
?>
Avatar billede perh Juniormester
28. juni 2010 - 19:03 #8
The_Buzz: Jo, det er mere en filsortering end dir sortering, men det skal jeg også bruge, og jeg kan se, hvordan man sorterer i eksemplet. Den sorterer ok efter filnavn og tid - tiden bestemmer placering, så det er ok.
Jeg skal nok ind og have fat i IPTC-info i selve fotoet, ellers vises bare uploadtidspunktet.
Avatar billede perh Juniormester
28. juni 2010 - 21:28 #9
jeg har nu brygget dette sammen med anvendelse af detaljer fra
showsource  s svar:

function readsubdirs($pathname) {
$root = opendir("pix");
echo '<select name="'.$pathname.'" onchange="submit()">'."\n";
$selected = $_POST['seldir'];
while(false !== ($subs = readdir($root))) {
if(filetype($subs) == "dir") {
if($subs != "." && $subs != "..") {
if($subs == $selected) {
$sel = " selected";
} else {
$sel = "";
}
$folders[] = $subs;
}
}
}

rsort($folders);
foreach ($folders as $drop){
echo '<option'.$sel.' value="'.$drop.'">'.$drop.'</option>'."\n";
}
echo '</select>';
}

Formen med med dropdown sender valgt foldernavn POST til egen side - men hvordan får jeg mulighed for at få variablen $sel gjort brugbar uden for while-løkken? Kan den erklæres global?
Problemet er at dropdownboksen viser forkert folder, ved valg af folder, da $sel ikke kommer med ud.
Avatar billede perh Juniormester
28. juni 2010 - 21:32 #10
Nå, $sel skal selvfølgelig også puttes i et array.
Men hvordan fletter jeg så de to arrays sammen til dannelsen af dropdownboksen?
Avatar billede perh Juniormester
28. juni 2010 - 22:18 #11
nu har jeg:

$folders[] = $subs;
$sels[] = $sel;
}
}
}

rsort($folders);
rsort($sels);
$i = 0;
foreach ($folders as $drop){
    echo '<option'.$sels[$i].' value="'.$drop.'">'.$drop.'</option>'."\n";
$i++;   
}
echo '</select>';

men så er der noget galt med sorteringerne, da "selected" ikke rammer den rigtige folderværdi i boksen?
Avatar billede perh Juniormester
29. juni 2010 - 21:04 #12
Jeg gør det lige tydeligere:

hvis jeg skriver arrayene i ovenstående ud, ser det sådan ud:

SELS:  Array
(
    [0] =>  selected
    [3] =>
    [1] =>
    [2] =>
)
FOLDERS:  Array
(
    [2] => 2010-06-26
    [0] => 2010-06-25
    [3] => 2010-06-24
    [1] => 2010-06-22
)

så der vises korrekt, at jeg her har valgt folder 2010-06-25, idet selected også har index [0], jeg kan bare ikke bygge det sammen , sikkert fordi jeg bruger en foreach løkke?
Jeg skal jeg skal have de sammenhørende index-værdier ind i

  echo '<option'.$sels[$i].' value="'.$drop.'">'.$drop.'</option>'."\n";
Avatar billede showsource Seniormester
29. juni 2010 - 23:26 #13
Når du echo din option, skal du lave tjek på hvad som er sat.
Ikke før.
Avatar billede perh Juniormester
30. juni 2010 - 09:29 #14
JA - klart, så kører det. Godt nok en sej kamp for en detalje.
Så står der blot en fejlmelding i sidekoden (kan ikke ses på websiden:

<select name="seldir" onchange="submit()">
<br />
<b>Warning</b>:  filetype() [<a href='function.filetype'>function.filetype</a>]: open_basedir restriction in effect. File(..) is not within the allowed path(s): (/var/www/web29/html/:/var/www/osv/osvv/:/var/www/mm/mmm/..osv..</b> on line <b>7</b><br />
<option value="#">-vælg dato-</option>
<option value="2010-06-26">2010-06-26</option>
<option value="2010-06-25">2010-06-25</option>
<option value="2010-06-24">2010-06-24</option>
<option selected value="2010-06-22">2010-06-22</option>
</select>

linie 6,7,8 ser sådan ud:

while(false !== ($subs = readdir($root))) {
if(filetype($subs) == "dir") {
if($subs != "." && $subs != "..") {
Avatar billede perh Juniormester
01. juli 2010 - 21:08 #15
showsource - skriv et svar - så deler jeg point mellem dig og Buzz
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester