sortierungsfunction

Maniac

Erfahrenes Mitglied
Hallo zusammen,

Ich hab mal wieder ne Frage:

Ich möchte mir eine Funktion basteln in der ich ein array sortieren kann.
Ich weiß es gibt schon Standart-Funktionen, aber die greifen bei mir nicht.

Ich lese mehrere Ordner mit kompletten Pfad in ein Array:

PHP:
$verzeichnisse = glob( "galerien/".$ordner."/*", GLOB_ONLYDIR );

gibt dann folgendes aus:
Code:
galerien/baustelle/06.03.2008-4

Hier wird bei den Standartfunktionen nur der String bis zum 1. Punkt sortiert, was natürlich nicht richtig ist. Darum hab ich am Ende der Ordnernamen noch "-4" angehangen.
Jetzt hab ich mir eine Funktion geschrieben welche den String zerlegt, so das nur noch die letzte Zahl über ist. Doch das mag auch nicht funktionieren.
Was mach ich falsch?

PHP:
function array_sort($a)
{
	$a = explode("-", $a);
	$b = $a[1];
	sort($b);
	return $b;
}

$verzeichnisse = glob( "galerien/".$ordner."/*", GLOB_ONLYDIR );
array_sort($verzeichnisse);

echo "<pre>";
var_export($verzeichnisse);
echo "</pre>";

var_export gibt folgendes aus:

Code:
array (
  0 => 'galerien/baustelle/06.03.2008-4',
  1 => 'galerien/baustelle/08.12.2007-1',
  2 => 'galerien/baustelle/10.01.2008-2',
  3 => 'galerien/baustelle/13.02.2008-3',
  4 => 'galerien/baustelle/15.06.2008-7',
  5 => 'galerien/baustelle/16.05.2008-6',
  6 => 'galerien/baustelle/17.07.2008-8',
  7 => 'galerien/baustelle/18.04.2008-5',
  8 => 'galerien/baustelle/31.07.2008-9',
)
aber sollte doch nun mit der 1 an oberster Stelle sein und aufwärts sortieren, oder nicht?
 
Ich kann dir sagen wie ich es ohne viel nachdenken machen würde, aber das ist garantiert eine der langsamsten Varianten:

PHP:
// alle strings umdrehen
$arr = array_map('strrev', $arr);
// sortieren lassen
asort($arr);
// wieder umdrehen
$arr = array_map('strrev', $arr);

Teste mal ob das so passt wie du das möchtest.
Prüfe auch wie sich dieses Script bei angehängten Zahlen von 1 bis >10 verhält
 
Zuletzt bearbeitet:
Ich kann dir sagen wie ich es ohne viel nachdenken machen würde, aber das ist garantiert eine der langsamsten Varianten:

PHP:
// alle strings umdrehen
$arr = array_map('strrev', $arr);
// sortieren lassen
asort($arr);
// wieder umdrehen
$arr = array_map('strrev', $arr);

Teste mal ob das so passt wie du das möchtest.
Prüfe auch wie sich dieses Script bei angehängten Zahlen von 1 bis >10 verhält

leider funktioniert das nur von 1 bis 9
 
Ich versteh eigentlich auch nich warum du diese Zahlen anhängst. Wird ne heiden Arbeit sein da noch was zwischen 4 und 5 z.B. zu tun.

Vielleicht hilft ja ein einfaches Flag bei meinem von vorhin:
PHP:
// alle strings umdrehen
$arr = array_map('strrev', $arr);
// sortieren lassen
asort($arr, SORT_NUMERIC);
// wieder umdrehen
$arr = array_map('strrev', $arr);

Glaube ich aber weniger....
Egal. Probier n bisschen mit den PHP-Funktionen rum so wie ich es mach:

PHP:
function array_rstring_sort(&$arr) {
  $tmp = array();
  foreach ($arr as $key => $val)
  {
    $tmp[$key] = substr($val, strrpos($val, "-"));
  }
  asort($tmp);
  foreach ($tmp as $key => $val)
  {
    $tmp[$key] = $arr[$key];
  }
  $arr = $tmp;
}

Ist über so viele Wege zu lösen, einen finds bestimmt.
Vielleicht ist es schon eine der obigen, aber die sind wie gesagt ohne viel nachdenken entstanden.
 
Code:
array (
  3 => 'galerien/baustelle/12.05.2008-10',
  1 => 'galerien/baustelle/08.12.2007-1',
  2 => 'galerien/baustelle/10.01.2008-2',
  4 => 'galerien/baustelle/13.02.2008-3',
  0 => 'galerien/baustelle/06.03.2008-4',
  8 => 'galerien/baustelle/18.04.2008-5',
  6 => 'galerien/baustelle/16.05.2008-6',
  5 => 'galerien/baustelle/15.06.2008-7',
  7 => 'galerien/baustelle/17.07.2008-8',
  9 => 'galerien/baustelle/31.07.2008-9',
)

wird ausgegeben wenn ich von 1-10 habe.
ich versuche mich ja schon seit einigen Stunden daran, viel gesucht, nicht wirklich was gefunden.
Ich werde mal Deine andere Möglichkeit versuchen.

edit: Deine Funktion war die Lösung, danke nochmal :)
 
Zuletzt bearbeitet:
Hi,

wenn Du das "-n"-Anhängsel weglässt, kann man auch das viel einfacher über [phpf]usort[/phpf] lösen:

PHP:
function cmpDate($a, $b) {
   $a_array = explode('.', $a);
   $b_array = explode('.', $b);
   return mktime(0,0,0,$a_array[1],$a_array[0],$a_array[2]) >= mktime(0,0,0,$b_array[1],$b_array[0],$b_array[2]);
}

usort($verzeichnisse, 'cmpDate');

LG
 
Zurück