MySQL
13.05.2009, 13:13:59
Potrzebuje zrzutowac array na bool ale istnieja 2 mozliwosc:
<?php
?>
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
13.05.2009, 14:43:51
W pierwszym przykładzie najpierw przypisujesz zmiennej wartość, a następnie rzutujesz ją. W drugim przypadku odwrotnie.
MySQL
14.05.2009, 09:54:51
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
14.05.2009, 10:04:15
<?
$array = range(0
, 100000
);
for($i = 0; $i < 10000000; $i++){
$w = (bool) $array;
}
for($i = 0; $i < 10000000; $i++){
(bool) $w = $array;
}
?>
Pisane z palca.
nospor
14.05.2009, 10:10:02
@mysql a co ty chcesz tym rzutowanie osiągnąć?
Bo o wiele, wiele szybsze jest poprostu empty()
<?php
?>
MySQL
14.05.2009, 16:48:56
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
14.05.2009, 16:50:45
Cytat
gdyż empty(false) jest niepoduszczalne
gdzies ty takie bzdury wyczytal?
http://pl2.php.net/manual/en/function.empty.php
MySQL
14.05.2009, 16:59:55
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
14.05.2009, 17:04:26
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
14.05.2009, 20:48:07
No i jest taka prosta sprawa, że empty() nie przyjmuje niczego innego oprócz zmiennych

Kiedyś potrzebowałem sprawdzić czy istnieje różnica między dwoma tablicami i chciałem zrobić tak:
<?php
} else {
}
?>
No i mi ładnie jechało wyjechało z errorem

Dopiero ponowne zaglądnięcie do manuala powiedziało dlaczego
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.