2010-08-19 3 views
1

Y at-il une fonction PHP qui procédez comme suit:Est-ce que cette fonction de tableau existe en PHP?

Déplacer une valeur de tableau spécifié à partir de son index actuel puis:

  1. Déplacé entre deux indices existants.
  2. Échange avec un second index/valeur.

J'ai fait la classe ci-dessous pour la tâche, mais je me demande s'il existe une fonction préexistante dans la bibliothèque PHP?

Voici la classe I ont créé pour la tâche:

class Rearranger 
{ 
    /* 
    * Determines how to move the specified value. 
    */ 
    public static function go($list, $indexToMove, $offset) 
    { 
     if(($offset == ($indexToMove - 1)) || ($offset == ($indexToMove + 1))) { 
      //Value is only being moved up or down one index, so just swap the values 
      $list = self::swap($list, $indexToMove, $offset); 
     } else if($offset < $indexToMove) { 
      //Value is being moved up (will be changing to a lower value index) 
      $list = self::move($list, $indexToMove, $offset); 
     } else if($offset > $indexToMove) { 
      //Value will be moving down (will be changing to a higher value index) 
      $list = self::move($list, $indexToMove, $offset - 1); 
     } 
     return $list; 
    } 

    /* 
    * Moves the value at $list[$indexToMove] in between 
    * $list[$offset - 1] and $list[$offset]. 
    */ 
    public static function move($list, $indexToMove, $offset) 
    { 
     $container = $list[$indexToMove]; 
     unset($list[$indexToMove]); 
     $list = array_values($list); 
     $list2 = array_slice($list, $offset); 
     $list = array_slice($list, 0, $offset); 
     array_push($list, $container); 
     return array_merge($list, $list2); 
    } 

    //Swap the values of two array indices 
    public static function swap($list, $indexA, $indexB) 
    { 
     $vA = $list[$indexA]; 
     $vB = $list[$indexB]; 
     $list[$indexA] = $vB; 
     $list[$indexB] = $vA; 
     return $list; 
    } 
} 

Voici quelques usages par exemple de la classe Rearranger:

$a1 = array('a', 'b', 'c', 'd', 'e', 'f'); 

function display($list) { echo '<p>' . var_dump($list) . '</p>'; } 

//Move value at index 4 to between index 0 and 1 
$a1 = Rearranger::go($a1, 4, 1); 
display($a1); 

//Move value at index 1 to between index 3 and 4 
$a1 = Rearranger::go($a1, 1, 4); 
display($a1); 

//Swap value 2 and 3  
$a1 = Rearranger::go($a1, 2, 3); 
display($a1); 

//Swap value 5 and 4 
$a1 = Rearranger::go($a1, 5, 4); 
display($a1); 

//Do nothing 
$a1 = Rearranger::go($a1, 2, 2); 
display($a1); 
+2

Rearranger semble sale pour moi;) Ah – Gordon

+0

mais le sale est dans votre esprit :-) –

Répondre

2

Qu'est-ce que vous voulez dire est un droit de l'algorithme de tri? Eh bien, il y a beaucoup de fonctions pour trier les tableaux dans php. La fonction dont vous avez besoin dépend des exigences exactes que vous souhaitez trier.

Beaucoup d'algorithmes de tri ont été conçus au fil des ans, prenez un look.

EDIT Que diriez-vous:

$source = array('a','b','c','d'); 
$head = array_splice($source,0,2); 
$tail = array_splice($source,2,4); 
$new = array_merge($head,array('e'),$tail); 
// should yield array('a','b','e','c','d') 
// Please check the array_splice documentation, iam not a 100% sure on the syntax. 

De cette façon, vous devriez être en mesure d'insérer un nouvel élément dans le tableau. Devrait vous aider sur votre chemin.

+0

Eh bien, je fournis les besoins exacts. –

+0

Merci pour le lien –

2
$a1 = array('a', 'b', 'c', 'd', 'e', 'f'); 

Insertion de l'élément de tableau à l'index:

array_splice($array, 3, 0, 'Z'); 
print_r($a1); 

Array ( [0] => a [1] => b [2] => c [3] = > Z [4] => d [5] => e [6] => f)

les éléments du tableau Permutation:

list($a1[4], $a1[3]) = array($a1[3], $a1[4]); 
print_r($a1); 

Array ( [0] => a [1] => b [2] => c [3] => d [4] => Z [5] => e [6] => f)

+0

J'ai essayé aussi d'utiliser array_splice, mais cela ne résout pas le problème de prendre une valeur et de l'insérer entre deux autres valeurs (sans écraser quoi que ce soit). Par exemple, en prenant $ a1 [3] et en insérant sa valeur entre $ a1 [4] et $ a1 [5]. Merci pour votre réponse –

Questions connexes