जवाबों:
intval()एक आधार पारित किया जा सकता है जिसमें से परिवर्तित करना है। (int)नही सकता।
int intval( mixed $var [, int $base = 10 ] )
$i++है गलत लाल रंग में। लेकिन यह धीमा होना चाहिए !!
$i++। आपका क्या अर्थ है? जब आप कहते हैं "लेकिन यह धीमा होना चाहिए !!" आप क्या तुलना करते हैं?
(int)टाइपकास्ट तेजी से x 2 है! (int): Ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
के बीच के अंतर के बारे में ध्यान देने वाली एक बात (int)और intval(): intval()चर का व्यवहार करता है जो पहले से ही ints और floats हैं, बिना आधार तर्क की परवाह किए बिना रूपांतरण (PHP 5.3.5 के रूप में कम से कम)। यह व्यवहार सबसे स्पष्ट नहीं है, जैसा कि PHP डॉक्टर पृष्ठ पर टिप्पणियों में नोट किया गया है और बेशर्मी से यहाँ दोहराया गया है:
$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.फिर से चार दिन पहले पृष्ठ को स्पष्ट रूप से अपडेट किया गया था, इसलिए शायद यही जोड़ा गया।
intval(12,8)कि जब कोई स्वरूपण के साथ एक स्ट्रिंग में परिवर्तित हो तो यह उत्तर देगा कि बेस 8 जैसा दिखेगा। संख्या सिर्फ गलत है। आप इससे क्या उम्मीद करेंगे intval(12,16)क्योंकि यह एक int नहीं बना सकता है c?
नेक्रोइंग के लिए क्षमा करें, मैं बस यह देखना चाहता था कि PHP7 का इस सवाल पर क्या प्रभाव पड़ता है:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
कसौटी:
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"
जैसा कि आप देख सकते हैं, कास्टिंग निश्चित रूप से तेज़ है, लगभग 100%
लेकिन मुझे लूप काउंट को 100 मिलियन तक बढ़ाना पड़ा, इससे पहले कि यह अंतर सेकंड का मामला था, जो तब होता है जब मैं वास्तव में प्रदर्शन के बारे में देखभाल करना शुरू कर दूंगा, ज्यादातर मामलों में।
तो मैं intvalफ़ंक्शन का उपयोग करने के साथ रहूंगा , क्योंकि कास्टिंग भाषा का जादू है जो हो रहा है। यहां तक कि अगर intvalपर्दे के पीछे कास्टिंग, अगर वहाँ थे एक बग होने के लिए उपयोग करता है कास्टिंग के साथ मिल गया, और किसी कारण यह तय नहीं किया जा सकता है (पश्च संगतता?) के लिए है, तो वे कम से कम ठीक से कर सकता है intvalयह कर्तव्य प्रदर्शन करने के लिए।
अद्यतन (PHP 7.1 + अतिरिक्त मामला):
$ 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"
7.1 अनुकूलित की तरह लग रहा है intval, और '1' + 0 अब इस गति प्रतियोगिता का विजेता है :) मैं अभी intvalभी वैसे भी उपयोग करता रहूंगा
+0है var के लिए ... सुनिश्चित नहीं है कि यहाँ निहित कास्ट स्पष्ट से तेज़ है।
+0जीतना ... यह एक बहुत ही गंदा हैक है
v5.5.34मेरे परिणाम थे 9191.0059452057 ms, 23307.397127151 msऔर 11483.719110489 msक्रमशः। इसलिए PHP 7 से पहले, कास्टिंग सबसे तेज़ है।
$a = '1' + 0;और मुझे यकीन है कि मैंने ऐसा करने के बारे में कभी नहीं सोचा था
मुझे लगता है कि कम से कम एक अंतर है: इंटवल के साथ , आप निर्दिष्ट कर सकते हैं कि किस आधार को दूसरे पैरामीटर के रूप में इस्तेमाल किया जाना चाहिए (डिफ़ॉल्ट रूप से आधार 10):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
आपको मिलेगा:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36, जैसे कि intval("g", 36) //16। 36 रिटर्न से बड़ा कोई भी मूल्य 0. यह बताता है कि हम अपने कस्टम बेस के लिए सभी 0-9 प्लस az अक्षर का उपयोग कर सकते हैं, जैसे कि intval("z",36) //35। इसके अलावा, यह ध्यान दिया जाना चाहिए कि पहला पैरामीटर केस-असंवेदनशील है ।
इसका एक उपयोगी गुण intvalयह है कि - चूंकि यह एक फ़ंक्शन है और भाषा निर्माण नहीं है - इसे एक फ़ंक्शन के लिए एक तर्क के रूप में पारित किया जा सकता है जो एक फ़ंक्शन की अपेक्षा करता है। आप ऐसा नहीं कर सकते (int)।
उदाहरण के लिए, मैंने इसका उपयोग पूर्णांक को एक एसक्यूएल IN()क्लॉज में शामिल करने के लिए इसे पास करके करने के लिए किया है array_map। यहाँ एक उदाहरण है:
$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'])
एम्बर सही है और अगर मैं आपकी अभिव्यक्ति से पहले एक उपयोगी जानकारी टाइप कास्टिंग (एक "(int)" जोड़कर) जोड़ सकता हूं तो इंटवल की तुलना में 300 से 600% तेज है। इसलिए यदि आपका उद्देश्य दशमलव के अलावा अन्य आधारों से निपटने का नहीं है, तो मैं उपयोग करने की सलाह देता हूं:
(int) $something
वह चीज़ जो intvalएक साधारण कलाकार करता है वह आधार रूपांतरण नहीं है:
int intval ( mixed $var [, int $base = 10 ] )
आधार 10 यद्यपि है, तो intvalएक कलाकारों के रूप में एक ही होना चाहिए (जब तक आप nitpicky और उल्लेख किया है कि एक एक समारोह कॉल, जबकि अन्य नहीं है बनाता जा रहे हैं)। जैसा कि मैन पेज पर दिया गया है :
पूर्णांक कास्टिंग के सामान्य नियम लागू होते हैं।