পিএইচপি-তে একটি স্ট্রিংকে বুলিয়ান মানতে পার্স করা


126

আজ আমি পিএইচপি নিয়ে খেলছিলাম, এবং আমি আবিষ্কার করেছি যে "সত্য" এবং "মিথ্যা" স্ট্রিংয়ের মানগুলি একটি শর্তে বুলিয়ানে সঠিকভাবে পার্স করা যায় না, উদাহরণস্বরূপ নিম্নলিখিত ফাংশনটি বিবেচনা করে:

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

যদি আমি কার্যকর করি:

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

এটি কেবল "1" এবং "0" মানগুলির সাথে কাজ করে বলে মনে হচ্ছে:

isBoolean("1") // Returns true
isBoolean("0") // Returns false

"সত্য" এবং "মিথ্যা" স্ট্রিংগুলি বুলিয়ানগুলিতে পার্স করার জন্য কি পিএইচপি-তে কোনও নেটিভ ফাংশন রয়েছে?


আপনার কোডে, isBoolean("")মিথ্যা ফিরে আসা উচিত।
বোলটলক

আপনার এরিক কারনের উত্তরের গ্রহণযোগ্য উত্তর পরিবর্তন করা উচিত। এটি আপনাকে একটি নেটিভ ফাংশন দেখায় যা আপনি যা চান তা করে।
কোড কমান্ডার

1
পিএইচপি স্ট্রিং কী বলে সে সম্পর্কে ভাবেন না, "মিথ্যা" মাত্র পাঁচটি অক্ষর যার অর্থ কিছুই নয়। এগুলি যদিও কিছু , তাই বুলিয়ান মানটি trueএকজন মানব পাঠকের কাছে মূল্যায়ন করলেও এটি বোঝার চেয়ে আরও স্বজ্ঞাত বলে মনে হয় FALSE
জিল

উত্তর:


413

এটি করার একটি নেটিভ পিএইচপি পদ্ধতি রয়েছে যা পিএইচপি এর ফিল্টার_ভার পদ্ধতি ব্যবহার করে:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

পিএইচপি এর ম্যানুয়াল অনুসারে :

"1", "সত্য", "অন" এবং "হ্যাঁ" এর জন্য সত্য প্রদান করে। অন্যথায় মিথ্যা ফিরিয়ে দেয়।

যদি FILTER_NULL_ON_FAILURE সেট করা থাকে তবে FALSE কেবল "0", "মিথ্যা", "বন্ধ", "না" এবং "" এর জন্য প্রত্যাবর্তন করা হয় এবং NUL সমস্ত বুলিয়ান মান হিসাবে ফিরে আসে for


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত ছিল। পিএইচপি ফাংশনে অন্তর্নির্মিত নিজের তৈরির চেয়ে ভাল। চাকা পুনর্নবীকরণের দরকার নেই! খুব খারাপ এটি খুব দেরী হয়ে গেছে: পি
কাসাফ

1
এটি কি তুলনার জন্য মানকে ছোট করে?
মোবাইলটিভিজেশন

3
@ চালনা, হ্যাঁ - এটি আপনি c মান (ভুয়া, মিথ্যা, ফলস, ইত্যাদি) এর জন্য কল্পনা করতে পারেন এমন কোনও কেস পরিচালনা করে
এরিক কারন

আমার শেষ টেস্টকেস বোর্ক তুলনার জন্য == পরিবর্তে == ব্যবহৃত হয়েছে। লোককে বিভ্রান্ত না করার জন্য আমার আগের মন্তব্যটি সরিয়ে ফেলবে।
অ্যান্ডিগ

6
উত্তরটি আমাকে পাহারায় ফেলেছে কারণ আপনাকে ফাংশনে পতাকাটি যুক্ত FILTER_NULL_ON_FAILUREকরতে filter_var()হবে এবং FILTER_VALIDATE_BOOLEANআমার যেমন ভেবেছিল তেমনভাবে এটি প্রতিস্থাপন করতে হবে না । এটি নিম্নলিখিত কোডের ফলাফল করবে যা আমার জন্য কৌশল করেছিল:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
ড্রাগন 54

14

কারণটি হ'ল যে সমস্ত স্ট্রিংগুলি trueএগুলি "0"এবং ""(খালি স্ট্রিং) ব্যতীত বুলেয়ানে রূপান্তর করার সময় মূল্যায়ন করে ।

নিম্নলিখিত ফাংশন ঠিক কি করতে হবে কি আপনি চান: এটা ঠিক পিএইচপি মত আচরণ, কিন্তু স্ট্রিং মূল্যায়ণ হবে "false"যেমন false:

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

ডকুমেন্টেশন ব্যাখ্যা করে যে: http://php.net/manual/en/language.tyype.boolean.php :

বুলিয়ান রূপান্তর করার সময়, নিম্নলিখিত মানগুলি মিথ্যা হিসাবে বিবেচনা করা হয়:

  • বুলিয়ান মিথ্যা নিজেই
  • পূর্ণসংখ্যা 0 (শূন্য)
  • ভাসা 0.0 (শূন্য)
  • খালি স্ট্রিং, এবং স্ট্রিং "0"
  • শূন্য উপাদান সহ একটি অ্যারে
  • বিশেষ ধরণের NULL (আনসেট ভেরিয়েবল সহ)
  • সিম্পল এক্সএমএল অবজেক্ট খালি ট্যাগ থেকে তৈরি

অন্যান্য প্রতিটি মান সত্য বলে বিবেচিত হয় (কোনও সংস্থান সহ)।


2
+1 দুর্দান্ত। (সেখানে একটি স্ট্রোলটার চক করতে পারে, তবে এটি সম্পর্কে।)
জন পার্কার

আমার মনে হয় মিদ্দাপার্ক মানে স্ট্র্টলওয়ার ($ মান) এর সাথে 'মিথ্যা' তুলনা করা। আক্ষরিক 'মিথ্যা' স্ট্র্টলওয়ারে পাস করা কি একটু .... ফাঁস? :)
পল ডিকসন

@ পল ডিকসন ইয়ুপ, এটাই আমি উল্লেখ করছি। :-)
জন পার্কার

2
@ মার্কো - যদি ($ মান && স্ট্রোলটার ($ মান)! == "ছদ্ম") you're যদি আপনি ফরাসী ভাষায় কাজ করছেন; যদি ($ মান && স্ট্র্টলওয়ার ($ মান)! == "ফলশ") german জার্মানিতে; যদি ($ মান && স্ট্রোলটার ($ মান)! == "অনওয়ার") dutch ডাচ ... আপনি বুঝতে পারবেন পিএইচপি কেন মান হিসাবে এটি তৈরি করে না
মার্ক বাকের

1
"সমস্ত শূন্য খালি স্ট্রিংগুলি" 0 "ব্যতীত বুলেয়ানে রূপান্তর করার সময় সত্য হিসাবে মূল্যায়ন করে" "
BoltClock

5

শুধুমাত্র পিএইচপিতে "0"বা খালি স্ট্রিং মিথ্যা করতে বাধ্য করে; অন্যান্য খালি খালি স্ট্রিংটি সত্য হয়ে যায়। ম্যানুয়াল থেকে :

বুলিয়ান রূপান্তর করার সময়, নিম্নলিখিত মানগুলি বিবেচনা করা হয় FALSE:

  • খালি স্ট্রিং, এবং স্ট্রিং "0"

স্ট্র "true"বনাম বনাম আপনার নিজের ফাংশন লিখতে হবে "false"। এখানে, আমি অন্য সমস্ত কিছুকে ডিফল্ট হিসাবে মিথ্যা বলে ধরে নিয়েছি:

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

পার্শ্ব নোটে যা সহজেই ঘনীভূত হতে পারে

function isBoolean($value) {
   return $value === "true";
}

4

আপনি যা জিজ্ঞাসা করছেন তার মতো স্ট্রিংগুলি পরিচালনা করার জন্য আমার সম্প্রতি একটি "আলগা" বুলিয়ান রূপান্তর ফাংশনটির প্রয়োজন ছিল (অন্যান্য জিনিসের মধ্যে)। আমি কয়েকটি ভিন্ন পদ্ধতির সন্ধান পেয়েছি এবং সেগুলি চালানোর জন্য পরীক্ষার ডেটার একটি বড় সেট নিয়ে এসেছি । কোনও কিছুই আমার প্রয়োজনের সাথে খাপ খায় না তাই আমি নিজের লেখা:

function loosely_cast_to_boolean($value) {
    if(is_array($value) || $value instanceof Countable) {
        return (boolean) count($value);
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
        $value = (string) $value;
        // see http://www.php.net/manual/en/filter.filters.validate.php#108218
        // see https://bugs.php.net/bug.php?id=49510
        $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
        if(!is_null($filtered)) {
            return $filtered;
        } else {
            // "none" gets special treatment to be consistent with ini file behavior.
            // see documentation in php.ini for more information, in part it says: 
            // "An empty string can be denoted by simply not writing anything after 
            // the equal sign, or by using the None keyword".
            if(strtolower($value) === 'none') {
                $value = '';
            }
            return (boolean) $value;
        }
    } else {
        return (boolean) $value;
    }
}

মনে রাখবেন যে বস্তুগুলির জন্য যা উভয়ই গণনাযোগ্য এবং স্ট্রিং-castালাইযোগ্য, সত্যতা নির্ধারণের জন্য এটি স্ট্রিংয়ের মানের চেয়ে বেশি গণনা করবে। এটি হ'ল যদি এটির মান নির্বিশেষে $object instanceof Countableফিরে আসবে ।(boolean) count($object)(string) $object

আমি যে পরীক্ষামূলক ডেটা ব্যবহার করেছি তার আচরণের পাশাপাশি এখানে বেশ কয়েকটি অন্যান্য ফাংশনের ফলাফল দেখতে পারেন । এই সামান্য iframe থেকে ফলাফল স্কিম করা একরকম কঠিন, সুতরাং আপনি পরিবর্তে একটি সম্পূর্ণ পৃষ্ঠায় স্ক্রিপ্ট আউটপুট দেখতে পারেন (যে URL টি নথিভুক্ত তাই এটি চিরকালের জন্য কাজ না করে)। যদি সেই লিঙ্কগুলি কোনও দিন মারা যায় তবে আমি কোডটি পেস্টবিনেও রেখেছি

"সত্য হওয়া উচিত" এবং কোনটি না হওয়া উচিত তার মধ্যে লাইনটি বেশ স্বেচ্ছাসেবী; আমার ব্যবহৃত ডেটাগুলি আমার প্রয়োজন এবং নান্দনিক পছন্দগুলির উপর ভিত্তি করে শ্রেণিবদ্ধ করা হয়েছে, আপনার ভিন্ন হতে পারে।


এই ফাংশনটি ত্রুটিহীনভাবে কাজ করে, আপনাকে ধন্যবাদ! তবে আপনার লিঙ্কগুলি এখন 404
6:25 এ সার্ভারম্যানফেইল

3

আপনি এই নির্মাণটি বুলিয়ানগুলিতে রূপের জন্য ব্যবহার করছি, যেহেতু আপনি trueঅন্যান্য অন্যান্য মানের জন্য চান :

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));

1

"সত্য" এবং "মিথ্যা" স্ট্রিংগুলি বুলিয়ানকে পার্স করার জন্য কি পিএইচপি-তে কোনও ফাংশন রয়েছে?

না - উভয়ই স্ট্রিং এবং সেগুলি উভয়ই (যেমন আপনি বলেছেন) মূল্যায়ন করে true। কেবল খালি স্ট্রিংগুলি falseপিএইচপি-তে মূল্যায়ন করে ।

আপনাকে এটির জন্য ম্যানুয়ালি পরীক্ষা করতে হবে। যদিও যদি সম্ভব হয় তবে এর পরিবর্তে "আসল" বুলিয়ান মানগুলির সাথে কাজ করা ভাল।


1
সমস্ত স্ট্রিং trueপিএইচপি-তে মূল্যায়ন করে না।
মূল

1
সংশোধন করা হচ্ছে না, কেবল স্পষ্ট করে বলছি। "উভয়ই স্ট্রিং [এবং এর মূল্যায়ন true]" বলার ফলে কোনও নবাবিকে ভুল ধারণা দিতে পারে, বিশেষত স্ট্রিং একটি স্ট্রিং যেখানে অন্য ভাষা থেকে কঠোর টাইপিংয়ের নিয়ম রয়েছে এবং যখন বুলিয়ানতে রূপান্তরিত হচ্ছে তখন বিষয়বস্তু কোনও বিষয় নয় like রুবি)।
কোরিউড

1
"শুধুমাত্র খালি স্ট্রিংগুলি পিএইচপি-তে মিথ্যা হিসাবে মূল্যায়ন করে।" তবে খালি নন স্ট্রিংয়ের "0"কী হবে? এটিও কি মূল্যায়ন করে না false?
সেপ্টেস্ট

0

নিরাপদে বুুলিয়ান রূপান্তর করার সহজ উপায়;

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'

0

আপনার এপিআই যদি অন্য সমস্ত কিছু হয়ে ওঠেnull কেবল "সত্য" বা "মিথ্যা" স্ট্রিং গ্রহণ করে তবে চেষ্টা করুন:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

এটি ধরে নেওয়া হয় যে $inputকোনও বস্তু নয়। নাল কোলেসেস ( ??) পিএইচপি 7.0 তে চালু হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.