2012-11-06 16 views
6

की पहली कुंजी देता है मैंने हाल ही में मेरे कोड में array_search फ़ंक्शन का उपयोग करते समय परेशानी देखी। मैं मूल्य "तेज" के लिए सरणी "$ allcraftatts" खोज रहा हूं। मैं एक दो लाइन प्रयोग सेट अप करके समस्या को अलग करने की कोशिश की:PHP array_search लगातार सरणी

$testcopy=$allcraftatts; 
$testsharp=array_search("sharp", $testcopy); 

का प्रयोग "(() get_defined_vars) print_r," बाद में, मैं इस परिणाम मिलता है:

[testcopy] => Array 
       (
        [0] => 0 
        [1] => 0 
        [2] => 0 
        [3] => 0 
        [4] => 0 
        [5] => 0 
        [6] => Sharp Stone 
        [7] => Sharp Stones 
        [8] => stone 
        [9] => object 
        [10] => sharp 
        [11] => hard 
        [12] => 0 
        [13] => 0 
        [14] => 0 
        [15] => 0 
        [16] => 0 
        [17] => 0 
        [18] => 0 
       ) 

[testsharp] => 0 

मुझे यकीन है कि मैं किसी अन्य समय में इन चरों को संशोधित नहीं बनाया है।

अब, अगर मैं

$testcopy=$allcraftatts; 
unset($testcopy[0]); 
$testsharp=array_search("sharp", $testcopy); 

करने के लिए अपने कोड बदलने यह रिटर्न "1"।

इससे मुझे विश्वास होता है कि यह हमेशा सरणी में पहली कुंजी देता है।

यह मुझे परेशान करता है! यह उन बगों में से एक है जो आपको भाषा के साथ कुछ गलत डरता है। हालांकि यह संदिग्ध है, मैं वास्तव में अंत में कुछ गलत के लिए PHP स्रोत को देखने के लिए प्रेरित किया गया था, लेकिन दुर्भाग्य से इसे समझ में नहीं आया।

यह देखते हुए कि यह एक आसान काम है, मैं निश्चित रूप से अनिवार्य रूप से सरल उत्तर से पूरी तरह से अपमानित होगा, लेकिन इस बिंदु पर, मुझे बस एक जवाब चाहिए।

+0

आप PHP किस संस्करण का उपयोग कर रहे हैं? क्या आप हमें 'print_r' की बजाय उन चरों पर' var_dump' का आउटपुट दिखा सकते हैं? यह दिखाएगा कि आपके पास कोई अतिरिक्त रिक्त स्थान है (जो 'array_search'' के साथ एक आम हिचकी लोगों का अनुभव है) –

उत्तर

8

array_search== उपयोग कर रहा है खोज

फार्म पीएचपी डॉक्टर

दौरान मूल्यों की तुलना करने के लिए तृतीय सख्त पैरामीटर सही पर सेट किया जाता है तो array_search() फ़ंक्शन भूसे के ढेर में समान तत्वों के लिए खोज करेंगे। इसका मतलब यह है कि यह घास के मैदान में सुई के प्रकार भी जांचेगा, और वस्तुओं को एक ही उदाहरण होना चाहिए।

पहला तत्व है क्योंकि 0 स्ट्रिंग खोज

सरल टेस्ट

var_dump("sharp" == 0); //true 
var_dump("sharp" === 0); //false 

समाधान उपयोग समान मान

$testsharp = array_search("sharp", $testcopy,true); 
               ^---- Strict Option 

var_dump($testsharp); 

आउटपुट

खोज करने के लिए strict विकल्प दौरान 0 में बदल दिया गया है
10 
2

की खोज से पहले किसी भी कुंजी, सांख्यिक शून्य है तो उस कुंजी दिया जाता है, क्योंकि यह एक "ढीला" मैच सरणी के डेटा प्रकार का प्रभुत्व प्रदर्शन कर रहा है, और "तेज" (यदि परिवर्तित int पर) शून्य के रूप में गिना जाता है। सख्त जांच का उपयोग करके, सही मूल्य पाया जाता है।

अन्यथा,

$testcopy = array_map('strval', $testcopy); 

क्रियान्वित ताकि मानों को स्ट्रिंग्स का अनुवाद कर रहे हैं, यह "ढीला" चेक के साथ भी काम करता है।

1

ढीले टाइपिंग की अद्भुत दुनिया में आपका स्वागत है। Php में, array_search nonstrict तुलना ("==") पर डिफ़ॉल्ट है, लेकिन आप सख्त ("===") को बल देने के लिए एक तीसरा पैरामीटर जोड़ सकते हैं। आप लगभग हमेशा सख्त चाहते हैं, हालांकि ऐसे समय होते हैं जब नॉनस्ट्रिक्ट सही ऑपरेशन होता है।

जांच के बाद:

$allcraftatts = array(0, 0, 0, 0, 0, 0, "Sharp Stone", "Sharp Stones", "stone", new stdClass(), "sharp", "hard", 0, 0, 0, 0, 0,0 ,0); 
$testcopy=$allcraftatts; 
$testsharp=array_search("sharp", $testcopy); 
$testsharpStrict=array_search("sharp", $testcopy, true); 

print_r(get_defined_vars());                                                       

if(0 == "sharp"){ 
    echo "true for == \n"; 
}else{ 
    echo "false == \n"; 
} 
if(0 === "sharp"){ 
    echo "true for === \n"; 
}else{ 
    echo "false === \n"; 
} 

और आउटपुट:

[testcopy] => Array 
     (
      [0] => 0 
      [1] => 0 
      [2] => 0 
      [3] => 0 
      [4] => 0 
      [5] => 0 
      [6] => Sharp Stone 
      [7] => Sharp Stones 
      [8] => stone 
      [9] => stdClass Object 
       (
       ) 

      [10] => sharp 
      [11] => hard 
      [12] => 0 
      [13] => 0 
      [14] => 0 
      [15] => 0 
      [16] => 0 
      [17] => 0 
      [18] => 0 
     ) 

    [testsharp] => 0 
    [testsharpStrict] => 10 
) 
true for == 
false === 
संबंधित मुद्दे