Odpowiedzi:
intval()
można przekazać bazę, z której można dokonać konwersji. (int)
Nie mogę.
int intval( mixed $var [, int $base = 10 ] )
$i++
ma niepoprawny czerwony kolor. Ale powinno być wolniejsze !!
$i++
. Co masz na myśli? Kiedy mówisz „Ale powinno być wolniej !!” co porównujesz
(int)
typecast jest szybszy x 2! (int)
: Ideone.com/QggNGc , intval()
: ideone.com/6Y8mPN
Jedną rzeczą, aby pamiętać o różnicy między (int)
i intval()
: intval()
traktuje zmienne, które są już int
S i float
S, która nie wymaga konwersji, niezależnie od argumentu podstawowego (od PHP 5.3.5 przynajmniej). To zachowanie nie jest najbardziej oczywiste, jak zauważono w komentarzach na stronie dokumentu PHP i bezwstydnie powtórzono tutaj:
$test_int = 12;
$test_string = "12";
$test_float = 12.8;
echo (int) $test_int; // 12
echo (int) $test_string; // 12
echo (int) $test_float; // 12
echo intval($test_int, 8); // 12 <-- WOAH!
echo intval($test_string, 8); // 10
echo intval($test_float, 8) // 12 <-- HUH?
The base parameter has no effect unless the var parameter is a string.
Potem znowu strona została zaktualizowana widocznie cztery dni temu, więc być może to właśnie został dodany.
intval(12,8)
które dałoby odpowiedź, że po przekształceniu w ciąg bez formatowania wyglądałoby jak podstawa 8 numer jest po prostu zły. Czego można oczekiwać, intval(12,16)
ponieważ nie może zrobić int c
?
Przepraszam za nekrozę, chciałem tylko sprawdzić, czy / jak PHP7 ma wpływ na to pytanie:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
Test:
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3279.1121006012 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "5379.3351650238 ms"
Jak widać casting jest zdecydowanie szybszy, o prawie 100%
Ale musiałem zwiększyć liczbę pętli do 100 milionów, zanim różnica była kwestią sekund, czyli w większości przypadków zacząłem dbać o wydajność.
Dlatego pozostanę przy użyciu tej intval
funkcji, ponieważ casting to trochę magii języka, która się dzieje. Nawet jeśli intval
używa rzutowania za kulisami, jeśli miałby zostać wykryty błąd podczas rzutowania i z jakiegoś powodu nie można go naprawić (kompatybilność wsteczna?), To mogliby przynajmniej naprawić, intval
aby wykonać swój obowiązek.
Aktualizacja (PHP 7.1 + dodatkowa skrzynka):
$ php -v
PHP 7.1.0RC6 (cli) (built: Nov 9 2016 04:45:59) ( NTS )
$ php -a
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3583.9052200317 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3569.0960884094 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = '1' + 0; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "1641.7920589447 ms"
Wygląda 7.1 zoptymalizowany intval
i „1” + 0 jest zwycięzcą tego konkursu prędkości :) ja nadal zachować stosując intval
w każdym razie
+0
var ... nie jestem pewien, czy ukryta obsada jest szybsza niż jawna.
+0
wygrywa ... to bardzo brudny hack
v5.5.34
moje wyniki były 9191.0059452057 ms
, 23307.397127151 ms
i 11483.719110489 ms
odpowiednio. Tak więc przed PHP 7 casting jest najszybszy.
$a = '1' + 0;
i założę się, że większość nigdy nie myślała o zrobieniu tego w ten sposób
Wydaje mi się, że istnieje co najmniej jedna różnica: za pomocą parametru intval można określić, która podstawa powinna być użyta jako drugi parametr (domyślnie podstawa 10):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
dostanie cię:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36
, takie jak w intval("g", 36) //16
. Każda wartość większa niż 36 zwraca 0. To sugeruje, że możemy użyć wszystkich znaków 0-9 plus az dla naszej niestandardowej bazy, np intval("z",36) //35
. Należy również zauważyć, że w pierwszym parametrze nie jest rozróżniana wielkość liter .
Jedną użyteczną właściwością intval
jest to, że - ponieważ jest to funkcja, a nie konstrukcja języka - może być przekazana jako argument funkcji, która oczekuje funkcji. Nie możesz tego zrobić (int)
.
Na przykład użyłem go do oczyszczenia liczb całkowitych w celu włączenia do IN()
klauzuli SQL , przekazując ją do array_map
. Oto przykład:
$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Bursztyn ma rację i jeśli mogę dodać przydatne rzutowanie typu informacji (dodanie „(int)” przed wyrażeniem) jest od 300 do 600% szybsze niż intval. Więc jeśli twoim celem nie jest zajmowanie się innymi bazami niż dziesiętne, polecam użycie:
(int) $something
Rzeczą, która intval
powoduje, że zwykły rzut nie jest, jest konwersja bazy:
int intval ( mixed $var [, int $base = 10 ] )
Jeśli baza ma 10, to intval
powinna być taka sama jak obsada (chyba że będziesz podejrzany i wspominasz, że jedno wywołuje funkcję, a drugie nie). Jak wspomniano na stronie podręcznika :
Obowiązują wspólne zasady rzutowania liczb całkowitych.