2012-04-27 11 views
37

क्या सरणी के भीतर से सरणी कुंजी का संदर्भ देने का कोई तरीका है? इस कोड प्रारूप में अधिक अर्थपूर्ण हो सकता है:PHP: सेल्फ-रेफरेंसिंग सरणी

$array=array(
    "Key1"=>array(
    "Value1", 
    "Value2" 
), 
    "Key2"=>&$this['Key1'] 
); 

क्या मैं चाहता हूँ उत्पादन $array['Key1'] के रूप में ही करने के लिए $array['Key2'] के लिए है। मैं एरे के निर्माण के बाद$array['Key2']=&$array['Key1']; जोड़ सकता हूं, लेकिन यदि संभव हो तो इसे सभी को एक कोड ब्लॉक में रखना चाहूंगा।

मैंने संदर्भों पर दस्तावेज़ों की जांच की है, साथ ही साथ कुछ सुझाव यहां दिए गए प्रश्न हैं और "php array संदर्भ" की खोज करते हैं।

+6

नहीं, आप नहीं कर सकते। सरणी बनाते समय, अभी तक कोई संभावित संदर्भ बिंदु नहीं है। तो आपको बाद में संदर्भ जोड़ना होगा। एक दिलचस्प प्रश्न के लिए – mario

+1

+1 :-) –

+1

एक कथन में ऐसा करने का कोई तरीका नहीं है, जब तक कि आप पहले से मौजूद किसी चीज़ का संदर्भ न दें। तो आप '$ ref = array (" value1 "," value2 ") बना सकते हैं; 'और फिर' $ array = array (' key1 '=> और $ ref,' Key2 '=> &$ref); 'और' अनसेट ($ रेफरी); 'बाद में - लेकिन कोई बात नहीं है, आप केवल वही काम करेंगे जो आपने सुझाया था और बाद में संदर्भ बनायेगा। – DaveRandom

उत्तर

27

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

निम्नलिखित कोड पर विचार करें:

<?php 

    $array = array(

    // Creates Key1 and assigns the value to it 
    // A copy of the value is also placed in $ref 
    // At this stage, it's not a reference 
    "Key1"=>($ref = array(
     "Value1", 
     "Value2" 
    )), 

    // Now Key2 is a reference to $ref, but not to Key1 
    "Key2"=>&$ref, 

    // Now everything is referenced together 
    "Key1"=>&$ref 

); 

मुझे आश्चर्य है कि इस कोई त्रुटि के साथ काम किया था, लेकिन यह करता है - here's the proof। बेशक, आप नहीं करेंगे, लेकिन आप कर सकते हैं ...

+1

+1 यह काम करता है क्योंकि जब आप सरणी में दो बार एक ही कुंजी घोषित करते हैं, तो यह पहले एक को ओवरराइट करता है। :-) –

+1

दरअसल यह स्पष्ट रूप से मामला है, मुझे आश्चर्य हुआ कि क्या यह शिकायत करेगा क्योंकि ऐसा करने में काफी अजीब बात है और मैंने वास्तव में पहले कभी कोशिश नहीं की है। जाहिर है, एक आम तौर पर एक सरणी में कुंजी को फिर से असाइन करता है, लेकिन शायद ही कभी घोषणा बयान में! – DaveRandom

+0

@Starx: टिप्पणियां और सफेद स्थान हटाएं। यह केवल एक बयान है। –

0

इसे एक ब्लॉक में बनाना असंभव है, क्योंकि आपने अभी तक चर को प्रारंभ नहीं किया है। कक्षा चर के साथ ही। ऐसी चीज करने के लिए, आपको किसी भी प्रकार का वैरिएबल बनाने की आवश्यकता होगी, और केवल इसके लिंक का उपयोग करने की आवश्यकता होगी, लेकिन इसकी याददाश्त का उपयोग करना, इसलिए एक बार फिर, आपके प्रश्न का वास्तविक उत्तर है - असंभव :)