1

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
  • 2
    RearRanger sounds dirty to me ;) Commented Aug 19, 2010 at 22:03
  • Ah but the dirty is in your mind :-) Commented Aug 19, 2010 at 22:04

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Well, I provided the exact requirements.
2
$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 )

1 Comment

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.