I have an array:
array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
and I need to swap the 'contact' with 'home', so the array would be like:
array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
how can I do this with PHP? :)
Try this:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;
$array = array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
$t = $array[0];
$array[0] = $array[1];
$array[1] = $t;
would be a simple enough approach…
Just use a temp variable to hold one value as you swap the other. Then restore the first with the temp variable. For numbers there are other methods that don't require the use of temp variables but here it's the best (only?) way.
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
print_r($a);
Array ( [0] => contact [1] => home [2] => projects )
$tmp = $a[0];
$a[0] = $a[1];
$a[1] = $tmp;
print_r($a);
Array ( [0] => home [1] => contact [2] => projects )
Just use a temp variable to hold it. So:
$temp = $array[0];
$array[0] = $array[1];
$array[1] = $temp;
That way you don't lose the value of one of them.
If you don't want to use another variable:
$array[0] = $array[0] + $array[1];
$array[1] = $array[0] - $array[1];
$array[0] = $array[0] - $array[1];
$x = array('a', 'b', 'c', 'd');
array_splice($x, 1, 2, array_reverse(array_slice($x, 1, 2)));
var_dump($x);
array_splice can replace a reversed array_slice
I wrote simple function array_swap
: swap two elements between positions swap_a
& swap_b
.
function array_swap(&$array,$swap_a,$swap_b){
list($array[$swap_a],$array[$swap_b]) = array($array[$swap_b],$array[$swap_a]);
}
For OP question (for example):
$items = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
array_swap($items,0,1);
var_dump($items);
// OUTPUT
array(3) {
[0]=> string(4) "home"
[1]=> string(7) "contact"
[2]=> string(8) "projects"
}
Update Since PHP 7.1 it's possible to do it like:
$items = [
0 => 'contact',
1 => 'home',
2 => 'projects'
];
[$items[0], $items[1]] = [$items[1], $items[0]];
var_dump($items);
// OUTPUT
array(3) {
[0]=> string(4) "home"
[1]=> string(7) "contact"
[2]=> string(8) "projects"
}
It's possible through Symmetric array destructuring.
If you want to avoid using temporary data storage, or love a one-liner use array_replace()
.
array_replace()
will make adjustments in accordance with the indices:
Code: (Demo)
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
var_export(array_replace($a,[$a[1],$a[0]]));
Output:
array (
0 => 'home',
1 => 'contact',
2 => 'projects',
)
In PHP 7.1+ syntax, you can use this
[$Array[$a], $Array[$b]] = [$Array[$b], $Array[$a]];
Solution:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
list($a[0], $a[1]) = [$a[1], $a[0]];
I have made function for it
function swap(&$a, &$b){
list($a, $b) = [$b, $a];
}
Usage:
swap($a[0], $a[1]);
I tested the 4 ways proposed to compare the performance:
$array=range(0,9999); //First 10000 natural numbers
$time=-microtime(true); //Start time
for($i=0;$i<1000000;++$i){ //1 Millon swaps
$a=array_rand($array); //Random position: ~60ms
$b=array_rand($array); //Random position: ~60ms
//Using a temp variable: ~70ms
$temp=$array[0];$array[0]=$array[1];$array[1]=$temp;
//Using list language construct: ~ 140ms
list($array[$a],$array[$b])=array($array[$b],$array[$a]);
//Using PHP 7.1+ syntax: ~ 140ms
[$array[$a],$array[$b]]=[$array[$b],$array[$a]];
//Using array_replace function: ~ 28000ms
array_replace($array,[$array[$a],$array[$b]]);
}
$time+=microtime(true); //Elapsed time
echo "Time: ",sprintf('%f', $time)," seconds";
Although it is probably not the most comfortable way, using a temporary variable seems to be 2x faster than the next 2 methods, and 400x faster than using the array_replace function.