Verschieben von Schlüsseln eines Arrays

JesusFreak777

Erfahrenes Mitglied
Hallo,

mal wieder ein Array:
Code:
array(
   1 => (array()),
   2 => (array()),
   3 => (array()),
   ...
)

ich habe ein verschachteltes Array bei dem die keys einfach nur Zahlen sind. Diesmal brauch ich eine Funktion um einen Key zu verschieben.

PHP:
function move($array. $movingkey, $direction) {

}

hier habe ich leider gar keinen ansatz...
ich weiß zwar, wie man mit unset oder push, werte entfernt und wieder einfügt,... aber ich hab keinen plan, ich ich es schaffe einen wert "einfach" zu verschieben (es gibt zwei richtungen "up" & "down").
Nach oben kommt unten bzw. nach unten kommt oben (wenn ich den letzten wert nach unten verschiebe muss er auf platz 1)

eine sehr "unschöne" idee wäre:
PHP:
function move($array, $movingkey, $direction) { //direction up oder egal :D ... beim movingkey müsste man wissen welche stelle im array

//   $array = array_merge($array); //array erstmal schön durchnummerieren - voraussetzung das es bereits vorher gemacht ist, dann stimmt auch der movingkey
   $max = count($array); //letzte stelle herausfinden

   $new_array = array(); //sekundäres array erstellen
   foreach($array as $key => $value) {
      $new_key = ($key + 1) * 2; //werte verdoppeln, damit zwischenräume zwischen den eizelnen werten entstehen... (da 0 * 2 nicht möglich ist, habe ich vorher jeweils +1 gemacht <- nicht zwingend notwendig, aber schöner)
      $new_array[$new_key] = $value; 
   }
   
   $tkey = ($movingkey + 1) * 2; //der zu verschiebende key mit neuer sortierung 
   $temp = $new_array[$tkey]; //inhalt zwischenspeichern
   unset($new_array[$tkey]); //zu verschiebenden key löschen
   
   if($direction == "up") { //aufwärts
      if($movingkey == 0) { //wenn oberster key
         $tkey = ($max * 2) + 1; //dann auf höchsten key +1
         $new_array[$tkey] = $temp;  //zwischenspeicher auf neue position einfügen
      } else {
         $tkey = (($movingkey + 1) * 2 ) - 3; //key nach oben verschieben
         $new_array[$tkey] = $temp; //zwischenspeicher auf neue position einfügen
      } 
   } else {
      if($movingkey == $max -1) { //wenn an höchster position
         $new_array[1] = $temp; //zwischenspeicher auf 1. position einfügen
      } else {
         $tkey = (($movingkey + 1) * 2 ) + 3; //key nach unten verschieben
         $new_array[$tkey] = $temp; //zwischenspeicher auf neue position einfügen
      } 
   }
   ksort($new_array); //array sortieren
   return array_merge($new_array); //neu durchnummerieren
}
}

es funktioniert... aber die schönste lösung ist es nicht...

Danke für jeden Tipp
 
Ich würde das etwa so lösen

http://ideone.com/ca1U2h
PHP:
<<?php
$array=array(0=>'a', 1=>'b', 2=>'c', 3=>'d');

print_r(move($array, 2, 'up'));
print_r(move($array, 3, 'up'));
print_r(move($array, 0, 'down'));

function move($array, $movingkey, $direction) {
   //Abbrechen, wenn der Key nicht exisiteiert
   if(!array_key_exists($movingkey, $array)) return $array;
  
   $keys = array_keys($array);                     //Schlüsel extrahieren
   $pos = array_search($movingkey, $keys);         //Position ermitteln
   unset($keys[$pos]);                             //Schlüssel aus Array entfernen
   $offset = $direction=='up' ? $pos+1 : $pos-1;   //Offset berechnen
   if($offset > count($keys)) $offset=0;           //EndOf Korrektur
   if($offset < 0) $offset=count($keys);           //BeginOf Korrektur
   array_splice($keys, $offset, 0, $movingkey);    //Key an neuer Position einfügen
   $retArr = array();                
   foreach($keys as $key){                         //Werte auf neue Positionen setzen
     $retArr[$key] = $array[$key];
   }
   $retArr = array_values($retArr);                //Neu durchnummerieren
   return $retArr;
}
?>

Nachtrag:
Zum Array neu durchnummerieren, verwendet man meistens array_values()
 
Zuletzt bearbeitet:
Zurück