Szybki swap dwóch zmiennych

Czasami spotykam się ze specjalnie pisaną funkcją swap zamieniająca wartości dwóch zmiennych między sobą.

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

Można to zrealizować troszkę szybciej (w sensie kodu):

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

Niestety nie sprawdzałem jeszcze jak bardzo różnią się te 2 sposoby pod względem wydajnościowym.

3 myśli na temat “Szybki swap dwóch zmiennych

  1. Jedna uwaga, w PHP5 nie ma już rozróżnienia na przekazywanie zmiennych przez wartość i referencję, więc ampersandy przy zmiennych można usunąć – zamieniamy tylko identyfikatory.

    Najprostsze zamienianie zmiennych i to bez dodatkowych funkcji można wykonać z wykorzystaniem konstrukcji list():

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

    Przy okazji – co powiesz na to:

    http://terriswallow.com/weblog/2007/swapping-two-variables-in-one-line-with-php/

    function swap($x, $y) {
        $x ^= $y ^= $x ^= $y;
        return array($x,$y);
    }
    
    1. A kiedyś zamianę z XORami w Pascalu użyłem. I to był chyba jeden, jedyny raz.
      Co do PHP5 i przekazywanie przez referencję, to nadal wydawało mi się, że jest przekazywane przez wartość (o ile argument nie jest obiektem).

      <?php
      function f1($a,$b) {
      	$tmp = $a;
      	$a = $b;
      	$b = $tmp;
      }
      function f2(&$a,&$b) {
      	$tmp = $a;
      	$a = $b;
      	$b = $tmp;
      }
      $c=1;
      $d=2;
      f1($c,$d);
      var_dump($c,$d);
      f2($c,$d);
      var_dump($c,$d);
      

      zwrócił mi przewidywane wartości:
      int(1)
      int(2)
      int(2)
      int(1)

      1. Zależy od wersji – to są tzw. strict standards – włącz maksymalne logowanie błędów E_ALL | E_STRICT i na PHP >5.2.0 na pewno dostaniesz warning. W każdym razie w tym momencie PHP przekazuje zmienne tylko przez referencję.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s

Ta witryna wykorzystuje usługę Akismet aby zredukować ilość spamu. Dowiedz się w jaki sposób dane w twoich komentarzach są przetwarzane.