tags:

views:

67

answers:

2

Is there a PHP function that will do the following:

Move a specified array value from it's current index and then either:

  1. Moved in between two existing indices.
  2. Swapped with a second index/value.

I made the class below for the task, but wonder if there is a pre-existing function in the PHP library?

Here is the class I have created for the task:

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;
    }
}

Here are some example usages of the Rearranger class:

$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  A: 

What you mean is a sort algorithm right? Well there are loads of functions to sort arrays in php. Wich function you need depends on the exact requirements by witch you want to sort.

Alot of sort alghoritms have been devised over the years, take a look.

EDIT How about:

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

This way you should be able to insert a new element into the array. Should help you on your way.

jpluijmers
Well, I provided the exact requirements.
letseatfood
Thanks for the link though
letseatfood
+1  A: 
$a1 = array('a', 'b', 'c', 'd', 'e', 'f');

Inserting array element at 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 )

Swapping array elements:

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 )

simplemotives
@simplemotives - I tried using array_splice also, but it does not solve the problem of taking one value and inserting it between two other values (without overwriting anything). For example, taking $a1[3] and inserting it's value between $a1[4] and $a1[5]. Thanks for your response
letseatfood