Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] rzutowanie array na bool
Forum PHP.pl > Forum > Przedszkole
MySQL
Potrzebuje zrzutowac array na bool ale istnieja 2 mozliwosc:
  1. <?php
  2. (bool)$w = mysql_fetch_row(mysql_query($sql));
  3. $w = (bool)mysql_fetch_row(mysql_query($sql));
  4. ?>

Pozniej jak sprawdzam var_dump($w) to zarowno pierwszy sposob jak i drugi powoduje ze zmienna $w jest typu bool.

Ale czy istnieja jakies subtelne roznice miedzy pierwszym sposobem a drugim czy takich nie ma i zalezy to tylko od upodobania programisty?
webdice
W pierwszym przykładzie najpierw przypisujesz zmiennej wartość, a następnie rzutujesz ją. W drugim przypadku odwrotnie.
MySQL
A czy wplywa to na efektywnosc?

Wydaje mnie sie ze pierwszy sposob jest bardziej "pracochlonny" poniewaz:
1. Zwrocona wartosc jest przypisywana do $w
2. Nastepuje zrzutowanie
3. Nastepnie przypisanie ponowne do $w wartosci nowego typu.

Czyli cos jakby $w = (bool)$w = mysql_fetch_row(mysql_query($sql));

A w drugim przykladzie zwracana wartosc jest rzutowana, a nastepnie przypisywana do $w.

Tak sobie to wymyslilem. Nie wiem, moze moje rozumowanie jest bledne...
Crozin
  1. <?
  2.  
  3. $array = range(0, 100000);
  4.  
  5. $s = microtime(true);
  6. for($i = 0; $i < 10000000; $i++){
  7.  $w = (bool) $array;
  8. }
  9. printf("Czas pierwszego: %f", microtime(true) - $s);
  10.  
  11. $s = microtime(true);
  12. for($i = 0; $i < 10000000; $i++){
  13.  (bool) $w = $array;
  14. }
  15. printf("Czas drugiego: %f", microtime(true) - $s);
  16. ?>
Pisane z palca.
nospor
@mysql a co ty chcesz tym rzutowanie osiągnąć?
Bo o wiele, wiele szybsze jest poprostu empty()

  1. <?php
  2. $w = !empty($array);
  3. ?>
MySQL
nospor fakt. Jest szybsze. Ale w moim przypadku jeżeli miałbym użyć konstrukcji
$w = !empty(mysql_fetch_rows(mysql_query($sql)))
to rozwiązanie zawiedzie, gdyż empty() oczekuje tablicy, a jeżeli mysql_query($sql) zwróci pusty zbiór wyników, to wówczas mysql_fetch_rows(mysql_query($sql)) zwróci false i PHP się wysypie gdyż empty(false) jest niepoduszczalne.

A dlaczego muszę mieć akurat taką konstrukcję? Hmm powiedzmy, że takie skrzywienie zawodowe ;-) Po prostu chciałem zobaczyć co jest bardziej wydajne.

Myślałem jeszcze nad trzecim rozwiązaniem:

$w = (mysql_num_rows(mysql_query($sql)) ? true : false);

Crozin przetestowałem wydajność dla tych trzech rozwiązań. Po prostu zapomniałem, że można by było to tak przetestować i oto wyniki (liczby w pętli zmniejszyłem do 100000 bo Twój przykład był dla z góry ustalonej tablicy, a zapytanie do bazy trochę trwa):

1. $w = (mysql_num_rows(mysql_query($sql)) ? true : false); – 8.201815
2. $w = (bool)mysql_fetch_rows(mysql_query($sql)); – 8.260985
3. (bool)$x = mysql_fetch_rows(mysql_query($sql)); – 8.267927

Sposób pierwszy – bezkonkurencyjny
Sposób drugi – to dodatkowe 0,60% czasu
Sposób trzeci – to dodatkowe 0,81% czasu

Zatem dziękuję wszystkim. Wszyscy oczywiście pomogliście (szybszego sposobu już chyba nie ma) :-)
nospor
Cytat
gdyż empty(false) jest niepoduszczalne
gdzies ty takie bzdury wyczytal?

http://pl2.php.net/manual/en/function.empty.php
MySQL
Nie wyczytałem, sprawdziłem. Kiedy w skrypcie napisałem
<?php $tmp = empty(false); ?>
to strona cały czas się wczytuje i się nie otwiera. A kiedy usunę tą linijke to wszsytko jest ok. Chociaż przeczytałem o funkcji empty() na php.net.pl i faktycznie może ona przyjąć wartość boolowską. Nie wiem dlaczego tak się dzieje :/
nospor
no dobra, po czesci masz racje.
nie: empty(false)
a:empty($zm) gdzie $zm moze byc false.

pozatym ten zapis
mysql_num_rows(mysql_query($sql))
jest o kant 4 liter bo jak bedzie blad zapytania to mysql_num_rows zacznie pluc warningami. Kazdy z etapow powinienes rozdzielic , zapisywac do zmiennej i robic odpowiednie sprawdzanie czy jest ok.
megawebmaster
No i jest taka prosta sprawa, że empty() nie przyjmuje niczego innego oprócz zmiennych winksmiley.jpg Kiedyś potrzebowałem sprawdzić czy istnieje różnica między dwoma tablicami i chciałem zrobić tak:
  1. <?php
  2. if(empty(array_diff($array1, $array2))){
  3. echo 'ok';
  4. } else {
  5. echo 'jest roznica';
  6. }
  7. ?>

No i mi ładnie jechało wyjechało z errorem winksmiley.jpg Dopiero ponowne zaglądnięcie do manuala powiedziało dlaczego biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.