我有一个数组:
array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
我需要将“contact”和“home”交换位置,使得数组看起来像这样:
array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
我该如何使用PHP实现这个功能? :)
我有一个数组:
array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
我需要将“contact”和“home”交换位置,使得数组看起来像这样:
array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
我该如何使用PHP实现这个功能? :)
我写了一个简单的函数array_swap
:交换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]);
}
对于OP的问题(例如):
$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"
}
更新 从PHP 7.1开始,可以这样做:
$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"
}
通过对称数组解构是可以实现的。
list()
完成:list($items[0], $items[1]) = [$items[1], $items[0]];
(在 PHP 7.1 之前的版本中支持)。 - glen-84试试这个:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;
[$Array[$a], $Array[$b]] = [$Array[$b], $Array[$a]];
syntax error, unexpected '='
。 - Jordan在交换另一个值时,只需使用临时变量来保存一个值。然后使用临时变量还原第一个值。对于数字,有其他方法可以不需要使用临时变量,但在这里使用临时变量是最好(唯一?)的方法。
$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 )
新回答:(正如其他人所表达的)
我在发布时并不知道对称数组解构,但那是一种无功能、一行代码的交换技术——我会整天使用它。
代码:(演示)
$a = ['contact', 'home', 'projects'];
[$a[0], $a[1]] = [$a[1], $a[0]];
var_export($a);
旧答案:
如果您想避免使用临时数据存储或喜欢一行代码,可以使用array_replace()
。
array_replace()
将根据索引进行调整:
代码:(演示)
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
var_export(array_replace($a,[$a[1],$a[0]]));
输出:
array (
0 => 'home',
1 => 'contact',
2 => 'projects',
)
array_replace($a, [I => $a[J], J => $a[I]])
将更易读且更少出错。 - luciole75w[$a[1], $a[0]] = $a;
:) - SirPilan我测试了提出的四种比较性能的方法:
$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[$a];$array[$a]=$array[$b];$array[$b]=$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";
尽管可能不是最舒适的方法,但使用临时变量似乎比下面的两种方法快2倍,比使用array_replace函数快400倍。
只需要使用一个临时变量来保存它。因此:
$temp = $array[0];
$array[0] = $array[1];
$array[1] = $temp;
$array = array(
0 => 'home',
1 => 'contact',
2 => 'projects'
);
$t = $array[0];
$array[0] = $array[1];
$array[1] = $t;
解决方案:
$a = array(
0 => 'contact',
1 => 'home',
2 => 'projects'
);
list($a[0], $a[1]) = [$a[1], $a[0]];
我已经为此编写了函数
function swap(&$a, &$b){
list($a, $b) = [$b, $a];
}
swap($a[0], $a[1]);
$x = array('a', 'b', 'c', 'd');
array_splice($x, 1, 2, array_reverse(array_slice($x, 1, 2)));
var_dump($x);
array_splice可以替换一个反转的array_slice