Jeszcze jeden blog o programowaniu

Radosne twórczości leniwego programisty

Szybki swap dwóch zmiennych

3 komentarze

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.

Reklamy

Written by filipgorczynski

2010.07.21 @ 19:24:45

Napisane w PHP

komentarze 3

Subscribe to comments with RSS.

  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);
    }
    

    Tomasz Kowalczyk

    2011.01.10 at 14:55:11

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

      filipgorczynski

      2011.01.10 at 15:11:26

      • 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ę.

        Tomasz Kowalczyk

        2011.01.10 at 15:56:42


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

Facebook photo

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

Google+ photo

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

Connecting to %s

%d blogerów lubi to: