Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] rzutowanie array na bool
MySQL
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


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?

Ten post edytował MySQL 13.05.2009, 13:14:28


--------------------
Pozdrawiam serdecznie
Krzysiek
Go to the top of the page
+Quote Post
webdice
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




W pierwszym przykładzie najpierw przypisujesz zmiennej wartość, a następnie rzutujesz ją. W drugim przypadku odwrotnie.
Go to the top of the page
+Quote Post
MySQL
post
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


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


--------------------
Pozdrawiam serdecznie
Krzysiek
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@mysql a co ty chcesz tym rzutowanie osiągnąć?
Bo o wiele, wiele szybsze jest poprostu empty()

  1. <?php
  2. $w = !empty($array);
  3. ?>


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
MySQL
post
Post #6





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował MySQL 14.05.2009, 17:10:37


--------------------
Pozdrawiam serdecznie
Krzysiek
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
gdyż empty(false) jest niepoduszczalne
gdzies ty takie bzdury wyczytal?

http://pl2.php.net/manual/en/function.empty.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
MySQL
post
Post #8





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 3.06.2008

Ostrzeżenie: (0%)
-----


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 :/


--------------------
Pozdrawiam serdecznie
Krzysiek
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
megawebmaster
post
Post #10





Grupa: Zarejestrowani
Postów: 143
Pomógł: 17
Dołączył: 8.11.2008
Skąd: Libiąż

Ostrzeżenie: (0%)
-----


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

Ten post edytował megawebmaster 14.05.2009, 20:48:24
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:29