[php] dir sorteren gaat ok, maar de sub-dir niet!?

Pagina: 1
Acties:

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
code: http://www.pino.nu/~phantom/index.phps
vb 1: http://www.pino.nu/~phantom/index.php
vb 2: http://www.pino.nu/~phantom/index.php?d=./photogallery

Om te beginnen wil ik ff zegge dat ik dit script niet zelf heb geschreven, maar dat ik er een aftreksel van gebruik.

Ik heb dus bijna hetzelfde script, en ik heb daarom ook het zelfde probleem als in bovenstaand script.

Het probleem
Het is dus een directorie viewer(zie vb 1), met het probleem dat alles in de directory waarin het scriptje staat wel gewoon goed wordt gesorteerd maar alle sub-dirs niet (zie vb 2).

Alle bestanden (en directory's) die gevonden worden worden in een array gegooid, en vervolgens gesorteerd door @sort($files_list); en @sort($directories_list);

maar dit werkt dus niet in de sub-dirs, waarom niet?

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
laat maar, ik zie t zelf al |:(

maar dan heb ik nog een probleem,
zie volgende reply van mij

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 02-06 23:18
ok, wel netjes gemaakt :)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
ik heb een ander probleem dat ik niet zelf weet waarom

in mijn aftreksel heb je ook een mogelijkheid om te sorteren op groote en datum, dit gaat helemaal mis, bijv bij grotes staan alle grotes helemaal door elkaar en is er geen logica aan af te lezen.

het script extra stuk script, waar $v1=7 voor groote en $v1=9 voor op datum te sorteren
PHP:
1
<?     function cmpdirs($a,$b){     global $v1;     $sa=stat($a);     $sb=stat($b);     if($sa[$v1]==$sb[$v1])        return 0;        return($sa[$v1]<$sb[$v1]?1:-1);}     @usort($files_list,"cmpdirs");     @usort($directories_list,"cmpdirs");?>

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Als je dat nou eens iets netter programmeerd dan werkt ie mischien wel... In principe kan de functie 2x een return uitvoeren (ik weet niet of de functie gewoon stopt bij een return, maar mooi is het niet)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
dat er 2x return staat heeft toch niets te maken met waarom die niet sorteerd...

ja, ik moet s wat netter gaan proggen, maar dan moet ik eerst alles ff een beetje doorhebben...

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 01 april 2002 12:55 schreef Janoz het volgende:
(ik weet niet of de functie gewoon stopt bij een return, maar mooi is het niet)
Ja dat is min of meer de definitie van een return toch? :)
"Stop de functie en geef eventueel een waarde terug aan de aanroep".

Maar netjes en duidelijk is het niet :)
Vooral niet zoals in het gecopieerde stukje code.
PHP:
1
<?     function cmpdirs($a,$b)     {         global $v1;         $sa=stat($a);         $sb=stat($b);         if($sa[$v1]==$sb[$v1])            return 0;         else            return( ($sa[$v1] < $sb[$v1]) ? 1 : -1);     }     @usort($files_list,"cmpdirs");     @usort($directories_list,"cmpdirs");?>

Vind ik dan toch duidelijker.
Of zelfs:
PHP:
1
<?     function cmpdirs($a,$b)     {         global $v1;         $sa=stat($a);         $sb=stat($b);         if($sa[$v1] > $sb[$v1])            $return = -1;         elseif($sa[$v1] < $sb[$v1])            $return  = 1;         else            $return = 0;         return $return;     }     @usort($files_list,"cmpdirs");     @usort($directories_list,"cmpdirs");?>

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
dat ziet er zeker een stuk overzichtelijker uit,
maar om nu te zeggen van, ahhh nu snap ik wat ik verkeerd heb gedaan, niet echt

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 01 april 2002 13:27 schreef Otacon het volgende:
dat ziet er zeker een stuk overzichtelijker uit,
maar om nu te zeggen van, ahhh nu snap ik wat ik verkeerd heb gedaan, niet echt
Meerdere returns is software technisch niet fout. Maar opzich niet goed programmeren en kan heel erg onduidelijk worden als je veel grote functies hebt :)

Eigenlijk moet je het zo zien: Een functie heeft 1 entrypoint (de aanroep) en zou daarom ook 1 exitpoint moeten hebben (die ene return).

De return zou eigenlijk altijd de functie moeten afsluiten, ipv halverwege zomaar ineens uitgevoerd worden.

Maar echt fout is het verder niet :)

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
iemand een idee waarom t schikken op groote / datum niet lukt?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Misschien wat off-topic, maar wat ik niet begrijp, is hoe je een probleem, dat volgens jou beoordeling geschikt is voor GoT, zelf in twee minuten kan hebben opgelost. Het is wel heel onwaarschijnlijk dat je al een half uur met het probleem bezig was, zonder het minste resultaat (want daar maak je geen melding van) maar twee minuten na het plaatsen van het bericht alsnog de oplossing vond.

Wat mij betreft mogen mensen die in minder dan tien minuten hun eigen probleem weten op te lossen permanent gebanned worden (disclaimer: maar dat zal ik wel weer mogen zeggen), ware het niet dat dit er voor zorgt dat mensen geen 'laat maar' meer durven te posten, wat voor de mensen op dit forum alleen maar vervelender is omdat ze dan vragen beantwoorden die eigenlijk al geen reactie meer behoeven.

Verder is het gebruikelijk om als je een oplossing hebt gevonden, deze oplossing ook even te vermelden. Dan hebben de anderen er ook nog wat aan. Daar hoef je met het soort mensen als de topicstarter, die denken dat de rest van GoT leeft om hun problemen op te lossen, natuurlijk niet mee aan te komen zetten. Blijkbaar mag ik al blij zijn dat ik te horen krijg wanneer mijn reactie niet langer gewenst is.

edit:
En dan vergeet ik nog het omhoog schoppen na een uur, terwijl in de FAQ daar "minstens 6 uur" voor staat.

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
Ik was met m'n eigen script bezig en daar kwam ik op het probleem dat de volgorde van groote niet klopte, vervolgens een heleboel geprobeerd, maar zonder resultaat, dus dacht ik: ik ga het vragen op GOT.

Mijn eigen code ziet / zag er ranzig uit, dus ik ging ff snel kijken of het originele script dezelfde fout bevatte(en dat leek zo op het eerste gezicht), dus linkte ik naar het originele script.

Toen na 2min dacht ik, na eindeloos gestaard te hebben, shittt, het wordt gewoon CaSe-sensitive gesorteerd.
Dus de vraag was die ik had gesteld was beantwoord, alleen ik had nog geen oplossing voor waar het eigenlijk om ging (mijn "tweede vraag").

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
en dan het kicken, dat deed ik na 2uur, ik weet t, dat is een beetje vlug, maar je weet zelf ook wel dat als je iets snel wilt weten je "per ongeluk" wel een klein kickje wil geven.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Wat heb je aan debuginfo? Bevat $v1 de goede waarde als je in de comparison functie bent? Gebruik je wel kloppende paden?

Om het maar weer eens voor te kauwen; zet bijvoorbeeld na de stat() functies de volgende debug-regel neer:
print "a='$a' b='$b' sa='$sa' sb='$b' v1='$v1'";
Op maandag 01 april 2002 23:38 schreef Otacon het volgende:
en dan het kicken, dat deed ik na 2uur, ik weet t, dat is een beetje vlug, maar je weet zelf ook wel dat als je iets snel wilt weten je "per ongeluk" wel een klein kickje wil geven.
Daar kan ik me echt niets bij voorstellen. Meestal ga ik even wat anders doen in zo'n geval.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Wat betreft het commentaar mijn comparison code; hij zag er in mijn oorspronkelijke versie leesbaarder uit. ;)

Verder ben ik geen tegenstander van meerdere return's in een functie. Dit houdt de code namelijk erg beknopt en to-the-point. Het kan weliswaar onduidelijk worden wanneer er nu precies uit de code gesprongen wordt, maar alleen als een functie te groot en/of onoverzichtelijk is. In dat geval moet de functie dus sowieso al opgesplitst worden in functionele blokken die gecombineerd worden tot een begrijpelijk geheel.

Verder kleven aan het gebruik van return variables een aantal nadelen. Ten eerste kan de compiler niet garanderen dat de variabele die je returned geldig geinitialiseerd is. Dit lijkt op te lossen door de variabele bij het declareren te initialiseren, maar dat is een hack; in de meeste gevallen zul je deze default waarde namelijk in de functie willen overschrijven. Dit is direct het volgende nadeel: het is nooit geheel duidelijk of een eenmaal geinitialiseerde return variabele niet later nog eens overschreven wordt (zeker als je code zo ingewikkeld is dat return-statements onduidelijk worden).

Het gebruik van return statements voegt semantische informatie aan je code toe, waardoor de compiler in staat is te waarschuwen voor paden zonder afsluiting of onbereikbare delen code. De werking van het return statement zelf zorgt er daarbij voor dat je precies eenmaal een waarde kan teruggeven en wel op de meest efficiente manier.

  • Otacon
  • Registratie: September 2000
  • Laatst online: 07-07 15:33
Soultaker, bedankt!!!

niet aan gedacht dat stat e.d. naar het bestand zelf kijken, en niet naar wat de array uitpoept.
Weer wat geleerd :)

Oplossing was dus:
PHP:
1
<?function cmpdirs($a,$b){     global $v1;     $sa=stat("./$subdir/$a");     $sb=stat("./$subdir/$b");     if($sa[$v1]==$sb[$v1])          return 0;     else          return( ($sa[$v1] < $sb[$v1]) ? 1 : -1);     }?>

Verwijderd

't script is iig wel relaxed, kan het goed gebruiken...

Thnx :)
Pagina: 1