উত্তর:
intval()
রূপান্তর করতে একটি বেস পাস করা যেতে পারে । (int)
না পারেন.
int intval( mixed $var [, int $base = 10 ] )
$i++
হয় ভুল লাল। তবে এটা ধীর হওয়া উচিত !!
$i++
। আপনি কি বোঝাতে চেয়েছেন? আপনি যখন বলেন "তবে এটি ধীর হওয়া উচিত !!" আপনি কি তুলনা করবেন?
(int)
টাইপকাস্ট দ্রুত এক্স 2! (int)
: Ideone.com/QggNGc , intval()
: ideone.com/6Y8mPN
মধ্যে পার্থক্য সম্পর্কে নোটটিতে একটা জিনিষ (int)
এবং intval()
: intval()
একইরূপে ভেরিয়েবল যা ইতিমধ্যে int
s এবং float
(পিএইচপি 5.3.5 অন্তত হিসাবে) কোন রূপান্তর প্রয়োজন, বেস যুক্তি নির্বিশেষে যেমন s। এই আচরণটি সর্বাধিক সুস্পষ্ট নয়, যেমনটি পিএইচপি ডক পৃষ্ঠায় মন্তব্যগুলিতে উল্লিখিত হয়েছে এবং নির্লজ্জভাবে এখানে পুনরায় বলা হয়েছে:
$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
?
নেক্রোংয়ের জন্য দুঃখিত, আমি কেবল দেখতে চেয়েছিলাম পিএইচপি 7 এর এই প্রশ্নের কোনও প্রভাব আছে কিনা:
$ 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
করার জন্য ঠিক করতে পারে ।
আপডেট (পিএইচপি 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
... নিশ্চিত নয় যে এখানে নিখুঁত castালাই সুস্পষ্টর চেয়ে দ্রুততর কিনা।
+0
বিজয়ী ... এটি একটি খুব নোংরা হ্যাক
v5.5.34
আমার ফলাফল ছিল 9191.0059452057 ms
, 23307.397127151 ms
এবং 11483.719110489 ms
যথাক্রমে। সুতরাং পিএইচপি 7 এর আগে castালাই সবচেয়ে দ্রুত।
$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-9 প্লাস এজে অক্ষর ব্যবহার করতে পারি 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'])
অ্যাম্বারটি সঠিক এবং আমি যদি কোনও দরকারী তথ্য প্রকারের ingালাই যুক্ত করতে পারি (আপনার অভিব্যক্তির আগে "(int)" যুক্ত করা হয়) ইনটোলটির চেয়ে 300 থেকে 600% দ্রুত হয়। সুতরাং যদি আপনার উদ্দেশ্য দশমিকের চেয়ে অন্য ঘাঁটিগুলির সাথে লেনদেন না করা হয় তবে আমি সুপারিশ করছি:
(int) $something
intval
সরল does ালাই যে জিনিসটি করে না তা হ'ল বেস রূপান্তর:
int intval ( mixed $var [, int $base = 10 ] )
যদি বেসটি 10 হয় তবে intval
এটি একটি castালাইয়ের মতোই হওয়া উচিত (যদি না আপনি নিটপিকি হয়ে যাচ্ছেন এবং উল্লেখ না করেন যে একটি ফাংশন কল করে অন্যটি না করে)। ম্যান পেজে যেমন উল্লেখ করা হয়েছে :
পূর্ণসংখ্যা ingালাইয়ের সাধারণ নিয়ম প্রয়োগ হয়।