33

我有一个数组:

array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);

我需要将“联系人”与“家”交换,所以数组就像:

array(
    0 => 'home',
    1 => 'contact',
    2 => 'projects'
);

我怎么能用 PHP 做到这一点?:)

4

10 回答 10

51

我写了一个简单的函数:在位置&array_swap之间交换两个元素。swap_aswap_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"
 }

可以通过Symmetric array destructuring来实现。

于 2014-04-03T13:19:19.777 回答
45

试试这个:

$a = array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;
于 2012-07-02T17:28:02.843 回答
7

只需在交换另一个值时使用一个临时变量来保存一个值。然后用 temp 变量恢复第一个。对于数字,还有其他方法不需要使用临时变量,但这是最好的(唯一?)方法。

$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 )
于 2012-07-02T17:23:48.423 回答
7

在 PHP 7.1+ 语法中,你可以使用这个

[$Array[$a], $Array[$b]] = [$Array[$b], $Array[$a]];
于 2017-10-17T13:51:38.880 回答
3

只需使用一个临时变量来保存它。所以:

$temp = $array[0];
$array[0] = $array[1];
$array[1] = $temp;

这样你就不会失去其中一个的价值。

于 2012-07-02T17:25:42.067 回答
3

新答案:(正如其他人所表达的)

在发帖时我不知道对称数组解构,但这是一种无功能的单行交换技术——我会整天使用它。

相关的博客文章/教程。冒泡排序的示例实现

代码:(演示

$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',
)
于 2017-07-24T09:27:38.513 回答
2
$array = array(
    0 => 'home',
    1 => 'contact',
    2 => 'projects'
);

$t = $array[0];
$array[0] = $array[1];
$array[1] = $t;

将是一个足够简单的方法......</p>

于 2012-07-02T17:23:05.990 回答
2

我测试了建议的 4 种方法来比较性能:

$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";

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.

于 2019-06-21T08:44:58.033 回答
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

于 2013-12-27T08:09:31.320 回答
0

解决方案:

$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]);

于 2018-07-02T13:40:19.983 回答