【问题标题】:Swap array values with php用php交换数组值
【发布时间】:2012-07-02 17:20:57
【问题描述】:

我有一个数组:

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

我需要将“联系人”与“家”交换,所以数组会是这样的:

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

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

【问题讨论】:

  • 你不能只使用一个临时变量来进行交换吗?
  • 如果需要对数组进行排序,需要定义明确的排序条件。
  • 也许是一个更好的问题:为什么它首先出现故障?

标签: php arrays


【解决方案1】:

我写了简单的函数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.

【讨论】:

  • 第二种方法也可以用list():list($items[0], $items[1]) = [$items[1], $items[0]];(PHP 7.1之前的版本支持)
【解决方案2】:

试试这个:

$a = array(
    0 => 'contact',
    1 => 'home',
    2 => 'projects'
);
$temp = $a[0];
$a[0] = $a[1];
$a[1] = $temp;

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 为什么PriestVallon 的回答获得更多投票并被接受?你的比他早五分钟,实际上完全一样(这让我害怕,他欺骗了你的答案)?
    【解决方案4】:

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

    [$Array[$a], $Array[$b]] = [$Array[$b], $Array[$a]];
    

    【讨论】:

    • 这不起作用并返回了syntax error, unexpected '=' PHP 7 中这属于什么?
    • (别忘了分号)7.1,不仅仅是版本 7 或任何子版本@Jordan
    • 不是我。 ?
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      relevant blog post/tutorial。一个example implemention for bubble sorting

      代码:(Demo)

      $a = ['contact', 'home', 'projects'];
      
      [$a[0], $a[1]] = [$a[1], $a[0]];
      
      var_export($a);
      

      旧答案:

      如果您想避免使用临时数据存储,或者喜欢单行,请使用array_replace()

      array_replace()会根据指数进行调整:

      代码:(Demo)

      $a = array(
          0 => 'contact',
          1 => 'home',
          2 => 'projects'
      );
      
      var_export(array_replace($a,[$a[1],$a[0]]));
      

      输出:

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

      【讨论】:

      • 除了性能之外,这仅适用于使用键 0 和 1 交换元素的非常特殊的情况。不过,对于想要一个新数组而不是就地交换的用户来说,这可能是一个诱人的单线。在这种情况下,像array_replace($a, [I => $a[J], J => $a[I]]) 这样更明确的形式在我看来会更具可读性且不易出错。
      • 感谢您提请我注意。这个答案没有反映我目前的建议,所以我进行了编辑。干杯。
      • 从 v7.4 开始你也可以[$a[1], $a[0]] = $a; :)
      • 这适合在这种情况下更改前两个元素,但不要尝试对第二个和第三个元素进行相同的操作。 3v4l.org/hRbnI@SirPilan
      • 在这种情况下,您需要在前面加上 , - example。这仅适用于小型阵列,所以我明白你的意思。
      【解决方案7】:
      $array = array(
          0 => 'home',
          1 => 'contact',
          2 => 'projects'
      );
      
      $t = $array[0];
      $array[0] = $array[1];
      $array[1] = $t;
      

      将是一个足够简单的方法......

      【讨论】:

        【解决方案8】:

        我测试了建议的 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";
        

        虽然这可能不是最舒服的方式,但使用临时变量似乎比接下来的 2 种方法快 2x,并且比使用 400x >array_replace 函数。

        【讨论】:

          【解决方案9】:
          $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

          【讨论】:

            【解决方案10】:

            解决方案:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-26
              • 2017-03-07
              • 1970-01-01
              相关资源
              最近更新 更多