2012-02-13 13 views
6

मैं कुछ डेटा पार्सिंग कोड पर काम कर रहा था, जबकि मैं निम्नलिखित में आया था।अजीब PHP स्ट्रिंग इंटीजर तुलना और रूपांतरण

$line = "100 something is amazingly cool"; 
$key = 100; 

var_dump($line == $key); 

खैर हम में से ज्यादातर डंप एक false निर्माण करने के लिए उम्मीद करेंगे, लेकिन मेरे आश्चर्य डंप एक true था!

मुझे समझ नहीं PHP में उस तरह जैसे रूपांतरण है कि वहाँ:

$x = 5 + "10 is a cool number"; // as documented on PHP manual 
var_dump($x); // int(15) as documented. 

लेकिन स्ट्रिंग के लिए पूर्णांक परिवर्तित करने की बजाय पूर्णांक मेरी स्ट्रिंग क्यों की तरह कैसे मैं पहले उदाहरण में वर्णित एक तुलना धर्मान्तरित है।

मुझे समझ नहीं कि तुम मेरी उदाहरण के लिए एक === सख्त-तुलना कर सकते हैं, लेकिन मैं सिर्फ जानना चाहता हूँ:

  • वहाँ पीएचपी प्रलेखन इस व्यवहार पर उल्लेख के किसी भी भाग है?
  • क्या कोई भी स्पष्टीकरण दे सकता है कि PHP में क्यों हो रहा है?
  • प्रोग्रामर ऐसी समस्या को कैसे रोक सकते हैं?
+0

== संख्यात्मक तुलना मुझे लगता है, और जब आप लेते हैं और स्ट्रिंग करते हैं और इसे किसी संख्या से बदलते हैं तो यह उस नंबर का उपयोग करता है। अगर यह शायद NaN की तरह कुछ वापस नहीं करता है। – rubixibuc

+0

हम में से अधिकांश उम्मीद करेंगे ....एक पूर्णांक में स्ट्रिंग कास्टिंग करते समय (जैसा कि किसी संख्या के साथ स्ट्रिंग की तुलना करते समय होता है), PHP पहले गैर-अंकीय अंकों पर मुकाबला करता है, इस मामले में 100 (सभी अंक) और "कुछ" के बीच की जगह होती है। एसओ 100 परिणामस्वरूप मूल्य है। –

+0

देखें http://stackoverflow.com/a/8672423 – Gumbo

उत्तर

4

यदि मैं कम से कम संभव प्रकार के दो चरों को दोहराता हूं तो PHP 'casts' को दोहराता है। वे इसे जॉगलिंग टाइप करते हैं।

प्रयास करें: var_dump("something" == 0); उदाहरण के लिए, जो आपको सच देगा। । क्या उसने मुझे एक बार पहले काट दिया था।

और जानकारी: http://php.net/manual/en/language.operators.comparison.php

+0

पर परिवर्तित करती है। PHP मैनुअल अब http://php.net/manual/en/language.types.type-juggling.php पर टाइप जॉगलिंग का वर्णन करता है जो बदले में http://php.net/manual पर संख्याओं के स्ट्रिंग रूपांतरण के बारे में एक अनुभाग से लिंक करता है /en/language.types.string.php#language.types.string.conversion –

1

मैं यह पहले से ही जवाब दिए और स्वीकार किया जाता है पता है, लेकिन मैं कुछ अन्य जो खोज के माध्यम से इस खोजने में मदद कर सकते हैं कि जोड़ना चाहते थे।

मुझे यह वही समस्या थी जब मैं एक PHP सरणी में एक पोस्ट सरणी बनाम कुंजी की तुलना कर रहा था, जहां मेरी पोस्ट सरणी में, मेरे पास अतिरिक्त स्ट्रिंग मान था।

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==$key){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

इस आपको लगता है कि अंत में $foo[0]["bar"]"0" के बराबर होगा लेकिन क्या हो रहा था कि जब $key = int 0 शिथिल $bar = string "other" के खिलाफ तुलना की जाती थी परिणाम इसे ठीक करने के true था है से, मैं सख्ती से तुलना, लेकिन फिर जरूरत एक $key = string "0" में के लिए जब पोस्ट सरणी array("other","0"); के रूप में परिभाषित किया गया था काम किया निम्नलिखित $key = int 0 कन्वर्ट करने के लिए:

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==="$key"){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

परिणाम था $foo[0]["bar"]="1" अगर 01,232,POST बार सरणी में था और $foo[0]["bar"]="0" यदि "0" POST बार सरणी में नहीं था।

याद रखें कि चर के तुलना में जब आपके चर की तुलना नहीं की जा सकती है जैसा कि आप PHP के ढीले परिवर्तनीय टाइपिंग के कारण सोचते हैं।

+0

शायद यह सिर्फ मुझे है, लेकिन आपका उदाहरण अपने स्वयं के अच्छे के लिए बहुत ही गड़बड़ है। ऐसा लगता है कि आप एक नियमित सरणी के भीतर घोंसले एक एसोसिएटिव सरणी के रूप में '$ foo' को परिभाषित करते हैं, लेकिन फिर नियमित सरणी को पार्स करने के लिए एसोसिएटिव सरणी अभिव्यक्ति' ($ key => $ डेटा) 'का उपयोग करें। यदि आपको डेटा में यह घोंसला होना है, तो क्यों न उस लूप को घोंसला न करें जो नियमित सरणी को संभालेगा? –

संबंधित मुद्दे