Achim Schrepfer: Lösung gefunden, aber vielleicht gehts noch besser?

Beitrag lesen

Hallo Leute,

mittlerweile habe ich eine Lösung für mein - zugegeben schlecht beschriebenes - Problem gefunden. Ich habe zwei Funktionen geschrieben, mit denen man Array-Elemente nach oben, bzw. unten verschieben kann. Für alle die es interessiert hier ein Beispielskript:

1 <?php
      2
      3 $array = array(
      4         'foo1' => 'Hallo',
      5         'bar2' => 'Welt',
      6         'baz3' => 'Du',
      7         'blk4' => 'Mök',
      8         'fmp5' => 'Blb'
      9 );
     10
     11 echo '<pre>';
     12 print_r(array_move_down($array, 'fmp5', 0));
     13 echo '</pre>';
     14
     15 //Ein Element anhand des Schlüssels um eine Position nach oben schieben
     16 function array_move_up($array, $key, $beam = false) {
     17
     18         //Wenn es den Schlüssel nicht gibt, dann nichts tun
     19         if (!isset($array[ $key ])) return $array;
     20
     21         $keys = array_keys( $array );
     22         $offs = array_flip( $keys );
     23         $prev_key = $keys[ $offs[ $key ] -1 ];
     24
     25         //Wenn kein Vorgänger vorhanden und nicht "gebeamt" werden soll, dann nichts tun
     26         if ((!$prev_key) && (!$beam)) return $array;
     27
     28         //Wenn kein Vorgänger vorhanden, aber "gebeamt" werden soll, dann das erste Element ans Ende hängen
     29         if ((!$prev_key) && ($beam)) {
     30                 $value = array_shift($array);
     31                 $array[ $key ] = $value;
     32                 return $array;
     33         }
     34
     35         $new_array = array();
     36
     37         foreach ($array AS $k => $v) {
     38                 if ($k != $prev_key) {
     39                         $new_array[ $k ] = $v;
     40                 } else {
     41                         $prev_value = $v;
     42                 }
     43
     44                 if ($k == $key) {
     45                         $new_array[ $prev_key ] = $prev_value;
     46                 }
     47         }
     48
     49         return $new_array;
     50 }
     51
     52 //Ein Element anhand des Schlüssels um eine Position nach unten schieben
     53 function array_move_down($array, $key, $beam = false) {
     54         return array_reverse( array_move_up(array_reverse($array),$key,$beam) );
     55 }
     56
     57 ?>

Die Funktion array_move_down() ist ein billiger Abklatsch und kehrt zweimal Array um, aber für meine Belange reicht es erstmal und es ist einfacher zu pflegen.

Wenn Ihr Verbesserungen dazu habt, könnt Ihr ja gerne posten.

viele Grüsse
Achim Schrepfer