Php सरणी कुंजियों में वर्ण की अनुमति है?


86

मेरे पास कुछ php एरे कीज़ हैं जो बहुत सारे अजीब चरित्रों से आबाद हैं।

क्या यह अनुमति है? क्या मेरे उपयोग के लिए कोई बाधाएं हैं?


प्रतिबंध:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

जवाबों:


90

मैनुअल के अनुसार :

कुंजी या तो पूर्णांक या एक स्ट्रिंग हो सकती है। मान किसी भी प्रकार का हो सकता है।

इसके अतिरिक्त निम्नलिखित प्रमुख जातियाँ होंगी:

  • मान्य पूर्णांक वाले स्ट्रिंग्स को पूर्णांक प्रकार में डाला जाएगा। उदाहरण के लिए कुंजी "8" वास्तव में 8 के तहत संग्रहीत किया जाएगा। दूसरी तरफ "08" को कास्ट नहीं किया जाएगा, क्योंकि यह एक वैध दशमलव पूर्णांक नहीं है।
  • फ़्लोटर्स को पूर्णांक में भी डाला जाता है, जिसका अर्थ है कि आंशिक भाग को काट दिया जाएगा। उदाहरण के लिए 8.7 कुंजी वास्तव में 8 के तहत संग्रहीत किया जाएगा।
  • बूलर्स को पूर्णांकों में डाला जाता है, अर्थात, कुंजी सच वास्तव में 1 के तहत संग्रहीत की जाएगी और 0 के तहत कुंजी झूठी होगी।
  • नल को रिक्त स्ट्रिंग में डाला जाएगा, अर्थात कुंजी नल वास्तव में "" के तहत संग्रहीत किया जाएगा।
  • एरे और ऑब्जेक्ट्स को चाबियों के रूप में इस्तेमाल नहीं किया जा सकता है। ऐसा करने से चेतावनी मिलेगी: अवैध ऑफसेट प्रकार।

मैनुअल फिर से :

एक स्ट्रिंग पात्रों की श्रृंखला है, जहां एक चरित्र बाइट के समान होता है। इसका मतलब है कि PHP केवल 256-वर्ण सेट का समर्थन करता है, और इसलिए मूल यूनिकोड समर्थन प्रदान नहीं करता है। स्ट्रिंग प्रकार का विवरण देखें।

तो संक्षेप में, कोई भी स्ट्रिंग एक कुंजी हो सकती है। और एक स्ट्रिंग में कोई भी बाइनरी डेटा (2GB तक) हो सकता है। इसलिए, एक कुंजी किसी भी बाइनरी डेटा हो सकती है (चूंकि एक स्ट्रिंग किसी भी बाइनरी डेटा हो सकती है)।

सरणी कुंजियों का कुछ यादृच्छिक (मान्य) दुरुपयोग:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
स्पष्ट करने के लिए, इसका मतलब यह नहीं है कि आप सरणी कुंजी के रूप में यूनिकोड स्ट्रिंग्स का उपयोग नहीं कर सकते। वास्तव में, कोई भी बाइनरी स्ट्रिंग ठीक काम करती है। मुझे लगता है कि यह वास्तव में सच नहीं है, क्योंकि मुझे यूनिकोड के समर्थन में PHP की स्व-वर्णित कमी परेशान करती है। :)
छल

1
@ डिसेज़ यूनिकोड "किसी भी द्विआधारी डेटा" की श्रेणी में आता है :) :) (हालांकि मुझे लगता है कि मैनुअल के शब्दांकन के साथ, मुझे लगता है कि स्पष्टीकरण आवश्यक है)। और यह कहना "देशी यूनिकोड समर्थन की पेशकश नहीं करता है" पर्याप्त सच है। PHP कोर में स्ट्रलेन, पदार्थ आदि के यूनिकोड संस्करण शामिल नहीं हैं, हालांकि "यूनिकोड स्ट्रिंग्स के मूल प्रसंस्करण की पेशकश नहीं करता है" अधिक उपयुक्त हो सकता है।
कॉर्बिन

3
ज़रूर, कोर में यूनिकोड स्ट्रिंग्स को हेरफेर करने के लिए कोई सुविधा नहीं है । लेकिन जब तक आप स्ट्रिंग्स में हेरफेर नहीं करना चाहते हैं, तब तक PHP उन्हें ठीक समर्थन करता है। और वास्तविक रूप से बोलते हुए, एमबी एक्सटेंशन डिफ़ॉल्ट रूप से लगभग हर PHP इंस्टॉलेशन पर उपलब्ध है, इसलिए "कोर सपोर्ट" या नहीं के बीच का अंतर ज्यादातर अकादमिक है। :)
छल

1
@ डिसेज़ शायद उनके नोट को "मूल रूप से (एमबी विस्तार देखें)" या फिर कुछ और पढ़ना चाहिए। तुम हालांकि सही हो। 2005 के बाद से कोई भी PHP स्थापना अनिवार्य रूप से यूनिकोड का समर्थन करती है, हालांकि मैं तर्क दूंगा कि PHP में यूनिकोड का समर्थन (विस्तार के साथ) अभी भी थोड़ा अप्रिय है।
कॉर्बिन

@ कोर्बिन, आप उपयोग के बजाय उस दुरुपयोग को क्यों कहते हैं ?
पचेरियर

12

कुंजी एक स्ट्रिंग या पूर्णांक होनी चाहिए। कुछ जातियाँ होती हैं जो होती हैं, लेकिन मुझे लगता है कि मैनुअल समझाने का अच्छा काम करता है:

कुंजी या तो पूर्णांक या एक स्ट्रिंग हो सकती है। मान किसी भी प्रकार का हो सकता है।

इसके अतिरिक्त निम्नलिखित प्रमुख जातियाँ होंगी:

  • मान्य पूर्णांक वाले स्ट्रिंग्स को पूर्णांक प्रकार में डाला जाएगा। उदाहरण के लिए "8" वास्तव में 8 के तहत संग्रहीत किया जाएगा। दूसरी तरफ "08" को नहीं डाला जाएगा, क्योंकि यह एक वैध दशमलव पूर्णांक नहीं है।
  • फ़्लोटर्स को पूर्णांक में भी डाला जाता है, जिसका अर्थ है कि आंशिक भाग को काट दिया जाएगा। उदाहरण के लिए 8.7 कुंजी वास्तव में 8 के तहत संग्रहीत किया जाएगा।
  • बूलर्स को पूर्णांकों में डाला जाता है, अर्थात, कुंजी सच वास्तव में 1 के तहत संग्रहीत की जाएगी और 0 के तहत कुंजी झूठी होगी।
  • नल को रिक्त स्ट्रिंग में डाला जाएगा, अर्थात कुंजी नल वास्तव में "" के तहत संग्रहीत किया जाएगा।
  • एरे और ऑब्जेक्ट्स को चाबियों के रूप में इस्तेमाल नहीं किया जा सकता है। ऐसा करने से चेतावनी मिलेगी: अवैध ऑफसेट प्रकार।

संसाधन प्रकारों को अब पूर्णांक में डाला जा सकता है (यह सुनिश्चित नहीं है कि यह एक नई विशेषता है), इसलिए आप उदाहरण के लिए एक फ़ाइल हैंडल या कर्ल हैंडल का उपयोग करके इसे एक पूर्णांक के रूप में एक पूर्णांक के रूप में रख सकते हैं और कुंजी के रूप में उपयोग कर सकते हैं।
थोमसट्रेटर

10

मुझे एक समस्या पर अधिक जानकारी की तलाश में यह उत्तर मिला। मैं उनमें UTF-8 वर्णों के साथ तार का उपयोग कर रहा था, जो मेरे पास एक सरणी के लिए कुंजी के रूप में काम नहीं करेगा।

कुछ इस तरह

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

मेरे लिए (बड़ा या चतुर नहीं) समाधान यही करना था ।।

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
मुझे सरणी कुंजियाँ बनाने के लिए md5 () पसंद है। यहां तक ​​कि अगर यह इस बिंदु पर पूरी तरह से आवश्यक नहीं है, तब भी यह सुरक्षित लगता है।
बिलीनाह

1
md5 () किसी भी स्ट्रिंग से एक सादा पाठ कुंजी बनाने के लिए एकदम सही है। सुरक्षा मुद्दा नहीं है। यह भी अच्छा है कि यह तेज है। एकमात्र मुद्दा यह है कि क्या वे पदावनत करने का निर्णय लेते हैं, फिर इसे समाप्त करते हैं, क्योंकि यह अब मूल रूप से डिजाइन किए गए के लिए अच्छा नहीं है। हम देखेंगे।
पतंजलि

2
क्या आप PHP के पुराने संस्करण का उपयोग कर रहे थे? आपका पहला उदाहरण PHP 7.1 में ठीक काम करता है।
इलियट बी।

6

PHP सरणी कुंजियाँ पूर्णांक या तार हो सकती हैं। PHP स्ट्रिंग्स बाइट सरणियाँ हैं, जिसका अर्थ बाइट्स के अनुक्रम हैं। स्ट्रिंग्स के अन्य प्रकार नहीं हैं और PHP अन्यथा सरणी कुंजी स्ट्रिंग्स पर कोई विशेष प्रतिबंध नहीं लगाता है। दूसरे शब्दों में: जब तक यह एक स्ट्रिंग है, तब तक कुछ भी हो जाता है।


मुझे लगता है कि एक स्ट्रिंग से एक पूर्णांक कुंजी तक निहित कास्ट बनाने के लिए एक महत्वपूर्ण अंतर है, क्योंकि कुछ फ़ंक्शन भिन्न रूप से संचालित होते हैं यदि कुंजी एक पूर्णांक है या नहीं। उदाहरण के लिए, आप केवल मनमानी स्ट्रिंग संख्याओं का उपयोग यह जानने के लिए कर सकते हैं कि एक सरणी फ़ंक्शन बाद में उन्हें 0..n-1 से reindexes करता है।
मैथ्यू

1
सहमत, लेकिन मुझे लगता है कि यह इस प्रश्न के दायरे की सीमा रेखा पर है। :)
छल

5

कुछ भी आप एक PHP स्ट्रिंग में सामान कर सकते हैं एक सरणी कुंजी के रूप में इस्तेमाल किया जा सकता है। अनुमति प्राप्त वर्णों की कोई सीमा नहीं है।

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

1

यदि जटिल चाबियाँ "अपरिभाषित सूचकांक" त्रुटि पैदा कर रही हैं, तो आपको बस "ट्रिम" समस्या हो सकती है।

मैं पागल हो रहा था क्योंकि एक जटिल कुंजी "अपरिभाषित सूचकांक" त्रुटि को थूक रही थी और मुझे लगा कि शायद यह एक वाक्यविन्यास उल्लंघन था। त्रुटि के कारण सरणी कुंजी को MySQL डेटाबेस क्वेरी से एक फ़ील्ड से बनाया गया था जिसे मैं एक कुंजी में परिवर्तित कर रहा था और एक नए सरणी में उपयोग कर रहा था। कुंजी इस तरह दिखती है: pl_1DNKoiJKwotCqAycickBVhTyऔर यहां कोड का निर्माण कैसे किया गया था।

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

जब वास्तव में, $keyvalऔर $dbquery['fieldname']एक पूर्ण मैच (दोनों ब्राउज़र में गूंज द्वारा नेत्रहीन सत्यापित) दिखाई दिया। इस तरह से trimदूसरे कथन का उपयोग करके रहस्य को सुलझाया गया : $keyval = trim($array_two['fieldname']);एक बार 'छंटनी' के बाद, अब शिकायत नहीं की गई।

इसकी आशा करना कुछ अन्य लोगों को कुछ निराशा भरे क्षणों से बचाता है ...


0

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


थोड़ा असंगत, हाँ, लेकिन यह अच्छी तरह से प्रलेखित है।
कॉर्बिन

0

सभी उत्तरों के अलावा वे सत्य हैं: आप PSR का उपयोग कर सकते हैं कि वे एक अच्छा और मानक कोडिंग शैली रखने के लिए सर्वश्रेष्ठ प्रोग्रामर के बीच कुछ प्रकार के नियम हैं।


0

Php सरणी में आप कुंजी का उपयोग नहीं कर सकते हैं: 2.3 या दशमलव संख्या


-1

ANSI "é" में php पेज को एनकोड करें (Cinéma wont show up as Cinà © ma) इस्तेमाल कर सकेंगे। नोटपैड ++ में बस मेनू एनकोड का उपयोग करें => एएनएसआई कन्वर्ट करें और सहेजें


2
(यह पोस्ट प्रश्न का एक गुणवत्ता उत्तर प्रदान करने के लिए प्रतीत नहीं होता है । कृपया या तो अपना उत्तर संपादित करें, या बस इसे प्रश्न के लिए एक टिप्पणी के रूप में पोस्ट करें)।
s --unıɐ ɐ qɐp

क्या आप आगे बता सकते हैं? यदि éमौजूद नहीं है, तो क्या होगा यदि ओपी नोटपैड ++ का उपयोग नहीं करता है?
निको हासे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.