web-dev-qa-db-ja.com

2つの変数の値を交換するためのPHP関数はありますか?

たとえば、私が持っていると言う...

$var1 = "ABC"
$var2 = 123

そして、特定の条件下で、私はそのように2つを交換したいです...

$var1 = 123
$var2 = "ABC"

PHP関数を使用して、値の1つを保持するために3番目の変数を作成し、それぞれを再定義するのではなく...

$var3 = $var1
$var1 = $var2
$var2 = $var3

とにかく3番目の変数を使用すると、このような単純なタスクのほうがおそらく高速であり、本当に必要な場合は常に独自の関数を作成できます。そのようなものが存在するかどうか疑問に思いましたか?

更新:3番目の変数を使用するか、関数でラップするのが最適なソリューションです。きれいでシンプルです。私は好奇心から質問をしましたが、選ばれた答えは一種の「次善の選択肢」でした。 3番目の変数を使用するだけです。

69
Taylor

TL; DR

組み込み関数はありません。下記のようにswap3()を使用します。

概要

多くの人が述べたように、これを行うには複数の方法がありますが、最も注目すべきは次の4つの方法です。

_function swap1(&$x, &$y) {
    // Warning: works correctly with numbers ONLY!
    $x ^= $y ^= $x ^= $y;
}
function swap2(&$x, &$y) {
    list($x,$y) = array($y, $x);
}
function swap3(&$x, &$y) {
    $tmp=$x;
    $x=$y;
    $y=$tmp;
}
function swap4(&$x, &$y) {
    extract(array('x' => $y, 'y' => $x));
}
_

4つの方法を1000回の反復のforループでテストし、最も速いものを見つけました。

  • swap1() = .19秒のおおよその平均を記録しました。
  • swap2() = .42秒のおおよその平均スコア。
  • swap3() = .16秒のおおよその平均スコア。 Winner!
  • swap4() = .7秒のおおよその平均を記録しました。

読みやすくするために、swap3()が他の関数よりも優れていることがわかりました。

注意

  • swap2()swap4()は、関数呼び出しのために常に他のものよりも遅くなります。
  • swap1()swap3()の両方のパフォーマンス速度は非常に似ていますが、ほとんどの場合swap3()はわずかに高速です。
  • 警告:swap1()は数字でのみ動作します!
98
evilReiko

私が知っている機能はありませんが、 Pete Graham の好意によるワンライナーがあります:

list($a,$b) = array($b,$a);

理解するのは本当に直感的ではないので、メンテナンスの観点からこれが好きかどうかはわかりません。

また、@ Paul Dixonが指摘しているように、これはあまり効率的ではなく、一時変数を使用するよりもコストがかかります。おそらく非常に大きなループで注目に値します。

ただし、これが必要な状況は、とにかく少し悪臭がします。議論したい場合:これは何のために必要ですか?

80
Pekka 웃

はい、今そのようなものが存在します。これは関数ではなく、言語構成体です(PHP 7.1以降で利用可能)。この短い構文が可能です:

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

詳細については、 "配列の構造化解除割り当ての角括弧構文" を参照してください。

29
Pawel Dubiel

古いXORトリックを使用することもできます(ただし、整数に対してのみ正常に動作し、コードを読みやすくしません。)

$a ^= $b ^= $a ^= $b;
16
Pawel Dubiel

はい、試してみてください this

// Test variables
$a = "content a";
$b = "content b";

// Swap $a and $b
list($a, $b) = array($b, $a);

これは、このような構文が完全に有効であるPythonを思い出させます:

a, b = b, a

上記のことをPHPで実行できないだけでは残念です...

9
Justin Ethier

別の方法:

$a = $b + $a - ($b = $a);
7
Prasanth

数字の場合:

$a = $a+$b;
$b = $a-$b;
$a = $a-$b;

ワーキング:

$ a = 10、$ b = 20としましょう。

$ a = $ a + $ b(現在、$ a = 30、$ b = 20)

$ b = $ a- $ b(現在、$ a = 30、$ b = 10)

$ a = $ a- $ b(現在、$ a = 20、$ b = 10スワップ!)

これはより高速で、必要なメモリも少なくなります。

function swap(&$a, &$b) {
    $a = $a ^ $b;
    $b = $a ^ $b;
    $a = $a ^ $b;
}

$a = "One - 1";
$b = "Two - 2";

echo $a . $b; // One - 1Two - 2

swap($a, $b);

echo $a . $b; // Two - 2One - 1

作業例: http://codepad.viper-7.com/ytAIR4

4

別の簡単な方法

$a=122;
$b=343;

extract(array('a'=>$b,'b'=>$a));

echo '$a='.$a.PHP_EOL;
echo '$b='.$b;
4
user2907171
list($var1,$var2) = array($var2,$var1);
4
Thomas Clayson

助けてくれてありがとう。これをPHP function swap()にした

function swap(&$var1, &$var2) {
    $tmp = $var1;
    $var1 = $var2;
    $var2 = $tmp;
}

コード例は次の場所にあります。

http://liljosh.com/swap-php-variables/

2
Josh LaMar

tempまたは3番目の変数を使用しない別の方法です

<?php
$a = "One - 1";
$b = "Two - 2";

list($b, $a) = array($a, $b);

echo $a . $b;
?>

そしてそれを関数にしたい場合:

    <?php
    function swapValues(&$a, &$b) {
         list($b, $a) = array($a, $b);
     }
    $a = 10;
    $b = 20;
    swapValues($a, $b);

    echo $a;
    echo '<br>';
    echo $b;
    ?>
2
Gaurang P

3つのオプション:

$x ^= $y ^= $x ^= $y; //bitwise operators

または:

list($x,$y) = array($y,$x);

または:

$tmp=$x; $x=$y; $y=$tmp;

最初のオプションは最速で、必要なメモリが少ないと思いますが、すべてのタイプの変数ではうまく機能しません。 (例:同じ長さの文字列に対してのみうまく機能します)
とにかく、この方法はどの角度から見ても算術法よりもはるかに優れています。
(算術:{$ a =($ a + $ b)-$ a; $ b =($ a + $ b)-$ b;} MaxIntの問題など)

例の機能:

function swap(&$x,&$y) { $x ^= $y ^= $x ^= $y; }
function swap(&$x,&$y) { list($x,$y) = array($y,$x); }
function swap(&$x,&$y) { $tmp=$x; $x=$y; $y=$tmp; }

//usage:
swap($x,$y);
2
Dani-Br

はい、私は多くの解決策が利用可能であることを知っています、しかし、ここにもう一つあります。 parse_str()関数も使用できます。参照 W3Schools PHP parse_str()function

<?php
    $a = 10;
    $b = 'String';

    echo '$a is '.$a;
    echo '....';
    echo '$b is '.$b;

    parse_str("a=$b&b=$a");

    echo '....After Using Parse Str....';

    echo '$a is '.$a;
    echo '....';
    echo '$b is '.$b;

?>

[〜#〜] demo [〜#〜]

1
Vidhyut Pandya

両方の変数が整数の場合、数学的アプローチを使用できます。

$a = 7; $b = 10; $a = $a + $b; $b = $a - $b; $a = $a - $b;

良いブログ投稿- http://booleandreams.wordpress.com/2008/07/30/how-to-swap-values-of-two-variables-without-using-a-third-variable/ =

1
Janis Janovskis