login  Naam:   Wachtwoord: 
Registreer je!
 Forum

array sorteren

Offline cyberninjah - 01/06/2010 09:55 (laatste wijziging 01/06/2010 09:56)
Avatar van cyberninjahLid Beste sitemasters,

ik probeer een DirectoryIterator te sorteren op alfabetische volgorde.
Maar ook meteen eerst directory's en daarna pas de files.

Nu heb ik de volgende array gemaakt omdat ik op internet las dat je een iterrator niet echt kan sorteren.

De code van me array is als volgt.

  1. $map = new DirectoryIterator('.');
  2. $n = 0;
  3. $files = array();
  4. foreach ($map as $file)
  5. {
  6.  
  7. $owner = posix_getpwuid($file->getOwner());
  8. $group = posix_getgrgid($file->getGroup());
  9. $perms = substr(sprintf('%o', $file->getPerms()), -4);
  10.  
  11. if (! $file->isDot())
  12. {
  13. $files[$n][0] = $file->getFilename();
  14. $files[$n][1] = number_format(($file->getSize() / 1024),2);
  15. $files[$n][2] = core::mdate($file->getMTime(),1);
  16. $files[$n][3] = $file->getPath();
  17. $files[$n][4] = $owner['name'];
  18. $files[$n][5] = $group['name'];
  19. $files[$n][6] = $perms;
  20. $files[$n][7] = $file->isDir();
  21. $n++;
  22. }
  23. }


Iemand een idee hoe ik dit kan oplossen ??

Output: het komt in een table te staan mocht dit noodzakelijk zijn.

9 antwoorden

Gesponsorde links
Offline MiST - 01/06/2010 10:02 (laatste wijziging 01/06/2010 10:03)
Avatar van MiST Lid Ik zou iets doen als dit:

  1. $dirContent = scandir('<foldername>');
  2. $files = array();
  3. $folders = array();
  4. foreach($dirContent as $dirItem)
  5. {
  6. if(is_dir($dirItem))
  7. {
  8. $folders[] = $dirItem;
  9. }
  10. else
  11. {
  12. $files[] = $dirItem;
  13. }
  14. }
  15. $files = sort($files); //weet niet of dit nodig is, normaal gezien zijn ze al op naam gesorteerd
  16. $folders = sort($folders); // weet niet of dit nodig is, normaal gezien zijn ze al op naam gesorteerd
  17. $dirContent = array_merge($folders, $files);


Ik heb geen idee welke klasse je daar gebruikt om door bestandsstructuren te bladeren.
Offline cyberninjah - 01/06/2010 10:14
Avatar van cyberninjah Lid DirectoryIterator() bedoel je ? dat is een standaard van php.
Heel makkelijk om te gebruiken voor mijn doel alleen het sorteren valt niet mee.
Offline MiST - 01/06/2010 18:17
Avatar van MiST Lid Iteratoren dienen dan ook enkel maar om collecties te overlopen, niet om te sorteren.

Je kan wel dezelfde techniek als in mijn vorige post beschreven toepassen met een DirectoryIterator.

Maar als je files en folders apart wil, zou ik daar toch terwijl je itereert 2 array variabelen voor maken.
Offline Stijn - 01/06/2010 18:53 (laatste wijziging 01/06/2010 18:53)
Avatar van Stijn PHP expert PHP.net: usort gebruiken. Ik heb een sorteer functie die eerst de directories neemt en dan de files op naam. Het is wel in Java gecodeert.

  1. public int compare(ExplorerItem o1, ExplorerItem o2)
  2. {
  3. if(o1.getType() == ExplorerItem.TYPE.DIRECTORY && o2.getType() == ExplorerItem.TYPE.FILE) {
  4. return -1;
  5. } else if((o1.getType() == ExplorerItem.TYPE.DIRECTORY && o2.getType() == ExplorerItem.TYPE.DIRECTORY)) {
  6. return 0;
  7. } else if(o1.getType() == ExplorerItem.TYPE.FILE && o2.getType() == ExplorerItem.TYPE.DIRECTORY) {
  8. return 1;
  9. } else {
  10. return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
  11. }
  12. }
Offline cyberninjah - 01/06/2010 23:43 (laatste wijziging 02/06/2010 01:27)
Avatar van cyberninjah Lid hmm ik ben bezig geweest met usort stijn. maar zonder echt resultaat helaas.

nog even verder proberen 

Edit: ik heb wat lopen proberen ben op de volgende code gekomen.


  1. <?php
  2. $aFiles = array();
  3. $aFolders = array();
  4.  
  5. $nFiles = 0;
  6. $nFolders = 0;
  7. foreach (new DirectoryIterator('.') as $fileInfo) {
  8. if($fileInfo->isDot()) continue;
  9.  
  10. if($fileInfo->isFile())
  11. {
  12. $owner = posix_getpwuid($fileInfo->getOwner());
  13. $group = posix_getgrgid($fileInfo->getGroup());
  14.  
  15. $aFiles[$nFolders][] = $fileInfo->getFilename();
  16. $aFiles[$nFolders][] = number_format(($fileInfo->getSize() / 1024),2);
  17. $aFiles[$nFolders][] = core::mdate($fileInfo->getMTime(),1);
  18. $aFiles[$nFolders][] = $owner['name'];
  19. $aFiles[$nFolders][] = $group['name'];
  20. $aFiles[$nFolders][] = substr(sprintf('%o', $fileInfo->getPerms()), -4);
  21. }
  22. else
  23. {
  24. if($fileInfo->isDir())
  25. {
  26. $owner = posix_getpwuid($fileInfo->getOwner());
  27. $group = posix_getgrgid($fileInfo->getGroup());
  28.  
  29. $aFolders[$nFolders][] = $fileInfo->getFilename();
  30. $aFolders[$nFolders][] = number_format(($fileInfo->getSize() / 1024),2);
  31. $aFolders[$nFolders][] = core::mdate($fileInfo->getMTime(),1);
  32. $aFolders[$nFolders][] = $owner['name'];
  33. $aFolders[$nFolders][] = $group['name'];
  34. $aFolders[$nFolders][] = substr(sprintf('%o', $fileInfo->getPerms()), -4);
  35. }
  36. }
  37.  
  38. $nFiles++;
  39. $nFolders++;
  40. }
  41.  
  42. sort($aFolders);
  43. sort($aFiles);
  44.  
  45. ?>
  46.  
  47. <table class="filemanager" width="100%" border="0" cellpadding="0" cellspacing="0">
  48. <thead>
  49. <tr>
  50. <th width="16"></th>
  51. <th class="filemanager-left" width="60%">Name</th>
  52. <th>Size</th>
  53. <th>Change date</th>
  54. <th>User</th>
  55. <th>Group</th>
  56. <th width="20">Permissions</th>
  57. </tr>
  58. </thead>
  59. <tfoot>
  60. <tr>
  61. <th colspan="8"></th>
  62. </tr>
  63. </tfoot>
  64. <tbody>
  65.  
  66. <?php
  67. foreach ($aFolders as $fileInfo)
  68. {
  69. ?>
  70. <tr class="filemanager-row" ondblclick="alert('File: <?php echo $fileInfo[3].'/'.$fileInfo[0]; ?>')">
  71. <td><img src="{template}img/filemanager/directory.png" /></td>
  72. <td class="filemanager-left"><?php echo $fileInfo[0] ?></td>
  73. <td><?php if($fileInfo[7]){ echo ' - - '; }else { echo $fileInfo[1].' KB'; } ?> </td>
  74. <td><?php echo $fileInfo[2] ?></td>
  75. <td><?php echo $fileInfo[3] ?></td>
  76. <td><?php echo $fileInfo[4] ?></td>
  77. <td><?php echo $fileInfo[5] ?></td>
  78. </tr>
  79. <?php
  80. }
  81.  
  82. foreach ($aFiles as $fileInfo)
  83. {
  84. ?>
  85. <tr class="filemanager-row" ondblclick="alert('File: <?php echo $fileInfo[3].'/'.$fileInfo[0]; ?>')">
  86. <td><img src="{template}img/filemanager/file.png" /></td>
  87. <td class="filemanager-left"><?php echo $fileInfo[0] ?></td>
  88. <td><?php echo $fileInfo[1].' KB'; ?> </td>
  89. <td><?php echo $fileInfo[2] ?></td>
  90. <td><?php echo $fileInfo[3] ?></td>
  91. <td><?php echo $fileInfo[4] ?></td>
  92. <td><?php echo $fileInfo[5] ?></td>
  93. </tr>
  94. <?php
  95. }
  96. ?>
  97.  
  98. </tbody>
  99.  
  100. </table>


Mocht er iemand een snellere manier hebben hoor ik het graag ik moet dit toch nog ombouwen naar class
Offline Stijn - 02/06/2010 02:07
Avatar van Stijn PHP expert
Citaat:
hmm ik ben bezig geweest met usort stijn. maar zonder echt resultaat helaas.
Als je mij code voorbeeld eens zou bekijken dan kan je dit makkelijk wel met usort.
Offline cyberninjah - 02/06/2010 10:32
Avatar van cyberninjah Lid ik heb jou code proberen om te zetten naar php helaas zonder echt super veel success.

na wat ik begreep van jou java code heb ik 2 arrays aangemaakt en daar gewoon de sort functie voor gebruikt mischien kan je me opweg helpen met usort stijn ?
Offline vinTage - 02/06/2010 11:01
Avatar van vinTage Nieuw lid
  1. <?php
  2. function SortByName($a, $b) {
  3. return strcasecmp($a['name'], $b['name']);
  4. }
  5.  
  6. $a = array("c","b","z","a");
  7.  
  8. usort($a, 'SortByName');
  9.  
  10.  
  11. print_r($a);
  12. ?>

bron
Offline Stijn - 02/06/2010 11:17
Avatar van Stijn PHP expert Die derde lijn code komt overeen met lijn 10 van mijn code.

  1. function sorteren($a, $b)
  2. {
  3. if($a[7] == true && $b[7] == false) {
  4. return -1;
  5. } else if($a[7] == true && $b[7] == true) {
  6. return 0; //misschien kan hier ook strcasecmp($a[0], $b[0])
  7. } else if($a[7] == false && $b[7] == true) {
  8. return 1;
  9. } else {
  10. return strcasecmp($a[0], $b[0]);
  11. }
  12. }


Btw, named-index'en is beter dan number-index'en. Het neemt meer geheugen in beslag maar je weet tenminste waar index 7 voor staat dan.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.247s