Achim Schrepfer: Array Elemente vertauschen

Hallo Forumers,

seit einiger Zeit zerbreche ich mir den Kopf, wie man möglichst effizient zwei Elemente eines Arrays vertauschen könnte. Und zwar soll z.B. aus

array('foo' => 'hallo', 'bar' => 'hello', 'baz' => 'hola');

das hier werden:

array('bar' => 'hello', 'foo' => 'hallo', 'baz' => 'hola');

Es sollten praktisch die Offset-Positionen der Elemente geändert werden. Vielen Dank schonmal im voraus.

viele Grüße
Achim Schrepfer

  1. 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