2011-05-25 34 views
12

PHP में एक foreach लूप के उदाहरणों में से एकपीएचपी foreach पाश उदाहरण भ्रम

foreach ($row as $key => $value) { 
    // somecode 
} 

मैं मुसीबत समझ => कर रहा है हो रहा है है। क्या कोई मुझे PHP द्वारा "देखा" या मूल्यांकन के माध्यम से चला सकता है? ऑपरेशन का आदेश क्या है, $key को क्या मूल्य आवंटित किया गया है?

foreach ($row as $value) { 
    // somecode 
} 

:

क्या यह से अलग बनाती है?

मैं तार्किक मैंने सोचा था कि $value का मूल्य $key को निर्दिष्ट किया जाएगा, तो यह $row की एक पंक्ति के रूप में नियुक्त किया जाएगा, लेकिन है कि स्पष्ट रूप से सही नहीं है ...

+0

संभावित डुप्लिकेट [संदर्भ - PHP में यह प्रतीक क्या है?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) –

उत्तर

2

दो उदाहरण ही हैं, लेकिन पहला व्यक्ति उस कुंजी की परिभाषा जोड़ता है जिसे आप वर्तमान में देख रहे हैं, और इसे $ कुंजी नाम दें।

तरह array('key' => 'value')

एक array() परिभाषा से तुलना करें, तो आप पहली विधि का उपयोग करते हैं, तो आप $ कुंजी वाला 'कुंजी' है और दूसरे उदाहरण में आप नहीं है।

$arr = array(
    'key1' => 'value1', 
    'key2' => 'value2' 
); 

मानक foreach वाक्य रचना हो जाता है सिर्फ मान::

9

पीएचपी सरणियों कुंजी के जोड़े और मूल्यों के रूप में जमा हो जाती है

foreach ($arr as $value) { 
    // value1, value2 
} 

विकल्प वाक्य रचना आप कुंजी पाने के लिए और साथ ही अनुमति देता है:

foreach ($arr as $key => $value) { 
    // $key is "key1", then "key2" 
    // $value is "value1" then "value2" 
} 

manual entry for foreach देखें।

0
foreach ($row as $key => $value) { ..somecode..} 

ऊपर इस तरह के रूप में, एक साहचर्य सरणी में प्रयोग किया जाता है:

array("a" => 1, "b" => 2, "c" => 3); 

उपरोक्त मामले में, $ कुंजी चर पहले मूल्य [पहली यात्रा पर एक, पर ख असाइन किया गया है दूसरा, अंतिम लूप पर सी) (जिसे कुंजी कहा जाता है) और $ वैल्यू वैरिएबल को दूसरा मान [1, पहले, 2 पर, अंतिम पर 3, अंतिम पर 3) (मूल्य कहा जाता है)

यदि वे कुंजी असाइनमेंट छोड़े गए थे तो $ मान को अभी भी दूसरा मान सौंपा जाएगा। कुंजी और मान के साथ foreach के लिए

0

opcodes: केवल मूल्य के साथ foreach के लिए

BCDF9C 0005: FE_RESET    (CV 0 ($array), u) -> VAR 2 
BCE014 0005: FE_FETCH    (VAR 2, u) -> VAR 3 
BCE08C 0005: OP_DATA    (u VAR 0 &(0+2208F38), u VAR 0 &(0+2208F38)) -> TMP_VAR 5 &(C8+2208F39) 
BCE104 0005: ASSIGN    (CV 2 ($value), VAR 3) -> VAR 4 
BCE17C 0005: ASSIGN    (CV 1 ($key), TMP_VAR 5) -> VAR 6 
BCE1F4 0005: JMP     (u &(BCDFA0+4)) 
BCE26C 0005: SWITCH_FREE   (VAR 2) 

opcodes:

BCE2E4 0007: FE_RESET    (CV 0 ($array), u) -> VAR 7 
BCE35C 0007: FE_FETCH    (VAR 7, u) -> VAR 8 
BCE3D4 0007: OP_DATA    (u VAR 0 &(0+2208F38), u VAR 0 &(0+2208F38)) -> u VAR 0 &(0+2208F38) 
BCE44C 0007: ASSIGN    (CV 2 ($value), VAR 8) -> VAR 9 
BCE4C4 0007: JMP     (u &(BCE2E8+B)) 
BCE53C 0007: SWITCH_FREE   (VAR 7) 

अजीब opcode प्रतिनिधित्व के लिए क्षमा करें।

असल में, कुंजी के बिना संस्करण प्रति पुनरावृत्ति दो कम चर निर्दिष्ट करता है।यह कुंजी और अस्थायी चर निर्दिष्ट नहीं करता है, लेकिन यह बस var को सीधे निर्दिष्ट करता है।

20

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

आपका सरणी इस प्रकार दिखाई देगा:

// "key" "value" 
// |  | 
// V  V 
$row['1'] = 'item1'; 
$row['2'] = 'item2'; 
$row['3'] = 'item3'; 
$row['4'] = 'item4'; 

कुंजी कुछ भी हो सकता है, वे संख्या होने की जरूरत नहीं है। इस तरह आप कुंजी को जानने के बिना सरणी में सभी वस्तुओं के माध्यम से पुन: प्रयास कर सकते हैं!

तो, अपना पहला उदाहरण इस प्रकार समझाया जा सकता है:

//   +--- The ARRAY where all of your data is 
//   | 
//   |  +----- The KEY to access that element of the array 
//   |  | 
//   |  |  +----- The VALUE of that element 
//   |  |  | 
//   V  V  V 
foreach ($row as $key => $value){ 
    if($row[$key] == $value){ // this statement is always true 
     echo "true AGAIN!"; // and thus will always print this line 
    } 
} 

जहां तक ​​मेरी समझ => चला जाता है वास्तव में नहीं, एक तरह के एक संकार्य है यह सिर्फ foreach पाश की संरचना को पूरा करने के लिए किया जाता है ।

+0

मुझे प्यार है चित्रकारी, लेकिन आपका उदाहरण गलत है। '$ key' में वास्तव में मान होंगे, कुंजी नहीं। – notJim

+0

धन्यवाद @notJim, और आप सही हैं, मेरी गलती .. मैं अपना जवाब ठीक कर दूंगा। उसे इंगित करने के लिए धन्यवाद। मैंने कोड को अपने सिर के ऊपर से ऊपर टाइप किया और इसे पहले नहीं देखा। चित्रों के लिए – CenterOrbit

+0

+1 – marcio

0

PHP Documentation से:

सरणियों के लिए, एक नामित कुंजी करने के लिए एक मूल्य बताए "=>" ऑपरेटर का उपयोग किया जाता है। इस ऑपरेटर की प्राथमिकता अन्य असाइनमेंट ऑपरेटर के समान है।

इस प्रश्न ने मुझे PHP में => ऑपरेटर के नाम के रूप में उत्सुकता प्राप्त की।

जैसा कि आप देख सकते हैं कि प्रलेखन स्पष्ट रूप से इसे नाम नहीं देता है। इससे मुझे आईआरसी पर PHP चैनलों को स्काउट करने का मौका मिलता है। आम सहमति यह है कि इसे रॉकेट ऑपरेटर कहा जाता है।

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