array sorteren
cyberninjah - 01/06/2010 09:55 (laatste wijziging 01/06/2010 09:56)
Lid
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.
$map = new DirectoryIterator('.');
$n = 0;
$files = array();
foreach ($map as $file)
{
$owner = posix_getpwuid($file->getOwner());
$group = posix_getgrgid($file->getGroup());
$perms = substr(sprintf('%o', $file->getPerms()), -4);
if (! $file->isDot())
{
$files[$n][0] = $file->getFilename();
$files[$n][1] = number_format(($file->getSize() / 1024),2);
$files[$n][2] = core::mdate($file->getMTime(),1);
$files[$n][3] = $file->getPath();
$files[$n][4] = $owner['name'];
$files[$n][5] = $group['name'];
$files[$n][6] = $perms;
$files[$n][7] = $file->isDir();
$n++;
}
}
$map = new DirectoryIterator( '.' ) ;
$n = 0 ;
foreach ( $map as $file )
{
if ( ! $file -> isDot ( ) )
{
$files [ $n ] [ 0 ] = $file -> getFilename ( ) ;
$files [ $n ] [ 2 ] = core:: mdate ( $file -> getMTime ( ) , 1 ) ;
$files [ $n ] [ 3 ] = $file -> getPath ( ) ;
$files [ $n ] [ 4 ] = $owner [ 'name' ] ;
$files [ $n ] [ 5 ] = $group [ 'name' ] ;
$files [ $n ] [ 6 ] = $perms ;
$files [ $n ] [ 7 ] = $file -> isDir ( ) ;
$n ++;
}
}
Iemand een idee hoe ik dit kan oplossen ??
Output: het komt in een table te staan mocht dit noodzakelijk zijn.
9 antwoorden
Gesponsorde links
MiST - 01/06/2010 10:02 (laatste wijziging 01/06/2010 10:03)
Lid
Ik zou iets doen als dit:
$dirContent = scandir('<foldername>');
$files = array();
$folders = array();
foreach($dirContent as $dirItem)
{
if(is_dir($dirItem))
{
$folders[] = $dirItem;
}
else
{
$files[] = $dirItem;
}
}
$files = sort($files); //weet niet of dit nodig is, normaal gezien zijn ze al op naam gesorteerd
$folders = sort($folders); // weet niet of dit nodig is, normaal gezien zijn ze al op naam gesorteerd
$dirContent = array_merge($folders, $files);
$dirContent = scandir( '<foldername>' ) ;
foreach ( $dirContent as $dirItem )
{
{
$folders [ ] = $dirItem ;
}
else
{
$files [ ] = $dirItem ;
}
}
$files = sort ( $files ) ; //weet niet of dit nodig is, normaal gezien zijn ze al op naam gesorteerd $folders = sort ( $folders ) ; // weet niet of dit nodig is, normaal gezien zijn ze al op naam gesorteerd
Ik heb geen idee welke klasse je daar gebruikt om door bestandsstructuren te bladeren.
cyberninjah - 01/06/2010 10:14
Lid
DirectoryIterator() bedoel je ? dat is een standaard van php.
Heel makkelijk om te gebruiken voor mijn doel alleen het sorteren valt niet mee.
MiST - 01/06/2010 18:17
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.
Stijn - 01/06/2010 18:53 (laatste wijziging 01/06/2010 18:53)
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.
public int compare(ExplorerItem o1, ExplorerItem o2)
{
if(o1.getType() == ExplorerItem.TYPE.DIRECTORY && o2.getType() == ExplorerItem.TYPE.FILE) {
return -1;
} else if((o1.getType() == ExplorerItem.TYPE.DIRECTORY && o2.getType() == ExplorerItem.TYPE.DIRECTORY)) {
return 0;
} else if(o1.getType() == ExplorerItem.TYPE.FILE && o2.getType() == ExplorerItem.TYPE.DIRECTORY) {
return 1;
} else {
return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
}
}
public int compare( ExplorerItem o1, ExplorerItem o2)
{
if ( o1.getType ( ) == ExplorerItem.TYPE .DIRECTORY && o2.getType ( ) == ExplorerItem.TYPE .FILE ) {
return - 1 ;
} else if ( ( o1.getType ( ) == ExplorerItem.TYPE .DIRECTORY && o2.getType ( ) == ExplorerItem.TYPE .DIRECTORY ) ) {
return 0 ;
} else if ( o1.getType ( ) == ExplorerItem.TYPE .FILE && o2.getType ( ) == ExplorerItem.TYPE .DIRECTORY ) {
return 1 ;
} else {
return o1.getName ( ) .toLowerCase ( ) .compareTo ( o2.getName ( ) .toLowerCase ( ) ) ;
}
}
cyberninjah - 01/06/2010 23:43 (laatste wijziging 02/06/2010 01:27)
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.
<?php
$aFiles = array();
$aFolders = array();
$nFiles = 0;
$nFolders = 0;
foreach (new DirectoryIterator('.') as $fileInfo) {
if($fileInfo->isDot()) continue;
if($fileInfo->isFile())
{
$owner = posix_getpwuid($fileInfo->getOwner());
$group = posix_getgrgid($fileInfo->getGroup());
$aFiles[$nFolders][] = $fileInfo->getFilename();
$aFiles[$nFolders][] = number_format(($fileInfo->getSize() / 1024),2);
$aFiles[$nFolders][] = core::mdate($fileInfo->getMTime(),1);
$aFiles[$nFolders][] = $owner['name'];
$aFiles[$nFolders][] = $group['name'];
$aFiles[$nFolders][] = substr(sprintf('%o', $fileInfo->getPerms()), -4);
}
else
{
if($fileInfo->isDir())
{
$owner = posix_getpwuid($fileInfo->getOwner());
$group = posix_getgrgid($fileInfo->getGroup());
$aFolders[$nFolders][] = $fileInfo->getFilename();
$aFolders[$nFolders][] = number_format(($fileInfo->getSize() / 1024),2);
$aFolders[$nFolders][] = core::mdate($fileInfo->getMTime(),1);
$aFolders[$nFolders][] = $owner['name'];
$aFolders[$nFolders][] = $group['name'];
$aFolders[$nFolders][] = substr(sprintf('%o', $fileInfo->getPerms()), -4);
}
}
$nFiles++;
$nFolders++;
}
sort($aFolders);
sort($aFiles);
?>
<table class="filemanager" width="100%" border="0" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th width="16"></th>
<th class="filemanager-left" width="60%">Name</th>
<th>Size</th>
<th>Change date</th>
<th>User</th>
<th>Group</th>
<th width="20">Permissions</th>
</tr>
</thead>
<tfoot>
<tr>
<th colspan="8"></th>
</tr>
</tfoot>
<tbody>
<?php
foreach ($aFolders as $fileInfo)
{
?>
<tr class="filemanager-row" ondblclick="alert('File: <?php echo $fileInfo[3].'/'.$fileInfo[0]; ?>')">
<td><img src="{template}img/filemanager/directory.png" /></td>
<td class="filemanager-left"><?php echo $fileInfo[0] ?></td>
<td><?php if($fileInfo[7]){ echo ' - - '; }else { echo $fileInfo[1].' KB'; } ?> </td>
<td><?php echo $fileInfo[2] ?></td>
<td><?php echo $fileInfo[3] ?></td>
<td><?php echo $fileInfo[4] ?></td>
<td><?php echo $fileInfo[5] ?></td>
</tr>
<?php
}
foreach ($aFiles as $fileInfo)
{
?>
<tr class="filemanager-row" ondblclick="alert('File: <?php echo $fileInfo[3].'/'.$fileInfo[0]; ?>')">
<td><img src="{template}img/filemanager/file.png" /></td>
<td class="filemanager-left"><?php echo $fileInfo[0] ?></td>
<td><?php echo $fileInfo[1].' KB'; ?> </td>
<td><?php echo $fileInfo[2] ?></td>
<td><?php echo $fileInfo[3] ?></td>
<td><?php echo $fileInfo[4] ?></td>
<td><?php echo $fileInfo[5] ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php
$nFiles = 0 ;
$nFolders = 0 ;
foreach ( new DirectoryIterator( '.' ) as $fileInfo ) {
if ( $fileInfo -> isDot ( ) ) continue ;
if ( $fileInfo -> isFile ( ) )
{
$aFiles [ $nFolders ] [ ] = $fileInfo -> getFilename ( ) ;
$aFiles [ $nFolders ] [ ] = number_format ( ( $fileInfo -> getSize ( ) / 1024 ) , 2 ) ; $aFiles [ $nFolders ] [ ] = core:: mdate ( $fileInfo -> getMTime ( ) , 1 ) ;
$aFiles [ $nFolders ] [ ] = $owner [ 'name' ] ;
$aFiles [ $nFolders ] [ ] = $group [ 'name' ] ;
$aFiles [ $nFolders ] [ ] = substr ( sprintf ( '%o' , $fileInfo -> getPerms ( ) ) , - 4 ) ; }
else
{
if ( $fileInfo -> isDir ( ) )
{
$aFolders [ $nFolders ] [ ] = $fileInfo -> getFilename ( ) ;
$aFolders [ $nFolders ] [ ] = number_format ( ( $fileInfo -> getSize ( ) / 1024 ) , 2 ) ; $aFolders [ $nFolders ] [ ] = core:: mdate ( $fileInfo -> getMTime ( ) , 1 ) ;
$aFolders [ $nFolders ] [ ] = $owner [ 'name' ] ;
$aFolders [ $nFolders ] [ ] = $group [ 'name' ] ;
$aFolders [ $nFolders ] [ ] = substr ( sprintf ( '%o' , $fileInfo -> getPerms ( ) ) , - 4 ) ; }
}
$nFiles ++;
$nFolders ++;
}
?>
<table class="filemanager" width="100%" border="0" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th width="16"></th>
<th class="filemanager-left" width="60%">Name</th>
<th>Size</th>
<th>Change date</th>
<th>User</th>
<th>Group</th>
<th width="20">Permissions</th>
</tr>
</thead>
<tfoot>
<tr>
<th colspan="8"></th>
</tr>
</tfoot>
<tbody>
<?php
foreach ( $aFolders as $fileInfo )
{
?>
<tr class="filemanager-row" ondblclick="alert('File:
<?php echo $fileInfo [ 3 ] . '/' . $fileInfo [ 0 ] ; ?> ')">
<td><img src="{template}img/filemanager/directory.png" /></td>
<td class="filemanager-left">
<?php echo $fileInfo [ 0 ] ?> </td>
<td>
<?php if ( $fileInfo [ 7 ] ) { echo ' - - ' ; } else { echo $fileInfo [ 1 ] . ' KB' ; } ?> </td>
<td>
<?php echo $fileInfo [ 2 ] ?> </td>
<td>
<?php echo $fileInfo [ 3 ] ?> </td>
<td>
<?php echo $fileInfo [ 4 ] ?> </td>
<td>
<?php echo $fileInfo [ 5 ] ?> </td>
</tr>
<?php
}
foreach ( $aFiles as $fileInfo )
{
?>
<tr class="filemanager-row" ondblclick="alert('File:
<?php echo $fileInfo [ 3 ] . '/' . $fileInfo [ 0 ] ; ?> ')">
<td><img src="{template}img/filemanager/file.png" /></td>
<td class="filemanager-left">
<?php echo $fileInfo [ 0 ] ?> </td>
<td>
<?php echo $fileInfo [ 1 ] . ' KB' ; ?> </td>
<td>
<?php echo $fileInfo [ 2 ] ?> </td>
<td>
<?php echo $fileInfo [ 3 ] ?> </td>
<td>
<?php echo $fileInfo [ 4 ] ?> </td>
<td>
<?php echo $fileInfo [ 5 ] ?> </td>
</tr>
<?php
}
?>
</tbody>
</table>
Mocht er iemand een snellere manier hebben hoor ik het graag ik moet dit toch nog ombouwen naar class
Stijn - 02/06/2010 02:07
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.
cyberninjah - 02/06/2010 10:32
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 ?
vinTage - 02/06/2010 11:01
Nieuw lid
<?php
function SortByName($a, $b) {
return strcasecmp($a['name'], $b['name']);
}
$a = array("c","b","z","a");
usort($a, 'SortByName');
print_r($a);
?>
<?php
function SortByName( $a , $b ) {
}
$a = array ( "c" , "b" , "z" , "a" ) ;
?>
bron
Stijn - 02/06/2010 11:17
PHP expert
Die derde lijn code komt overeen met lijn 10 van mijn code.
function sorteren($a, $b)
{
if($a[7] == true && $b[7] == false) {
return -1;
} else if($a[7] == true && $b[7] == true) {
return 0; //misschien kan hier ook strcasecmp($a[0], $b[0])
} else if($a[7] == false && $b[7] == true) {
return 1;
} else {
return strcasecmp($a[0], $b[0]);
}
}
function sorteren( $a , $b )
{
if ( $a [ 7 ] == true && $b [ 7 ] == false ) {
return - 1 ;
} else if ( $a [ 7 ] == true && $b [ 7 ] == true ) {
return 0 ; //misschien kan hier ook strcasecmp($a[0], $b[0])
} else if ( $a [ 7 ] == false && $b [ 7 ] == true ) {
return 1 ;
} else {
}
}
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 .