PHP में सरणी कुंजी के रूप में एक संख्यात्मक स्ट्रिंग


104

क्या यह "123"एक PHP सरणी में एक कुंजी के रूप में एक संख्यात्मक स्ट्रिंग का उपयोग करना संभव है , इसके बिना पूर्णांक में परिवर्तित किया जा सकता है?

$blah = array('123' => 1);
var_dump($blah);

प्रिंट

array(1) {
  [123]=>
  int(1)
}

मुझे चाहिए

array(1) {
  ["123"]=>
  int(1)
}

7
चूंकि PHP लगभग हर उद्देश्य के लिए , "123"== टाइप की 123जाती है। क्या कारण है कि आप इसे विशेष रूप से एक स्ट्रिंग के रूप में चाहते हैं (और एक इंट खराब है)?
ircmaxell

17
मेरे दिमाग में आने वाला कारण सरणी कार्यों से संबंधित है जैसे array_merge "यदि इनपुट सरणियों में समान स्ट्रिंग कुंजियाँ हैं, तो उस कुंजी के लिए बाद का मान पिछले वाले को अधिलेखित कर देगा। यदि, हालांकि, सरणियों में संख्यात्मक कुंजियाँ हैं , तो बाद का मान नहीं होगा। मूल मूल्य को अधिलेखित करें, लेकिन संलग्न किया जाएगा। "
17

8
एक और उदाहरण जहां सरणी कुंजियों के रूप में संख्यात्मक तार समस्याग्रस्त हैं:asort
22


4
एक और उपयोग मामला: यूनिट परीक्षण JSON डेटा संक्रमण। JSON और बैक के लिए इस तरह के एक सरणी को बदलने से आप यह दावा नहीं कर पाएंगे कि दोनों मूल और परिणाम बिल्कुल समान हैं।
डेविड

जवाबों:


90

नहीं; नहीं यह नहीं:

से मैनुअल :

एक कुंजी एक पूर्णांक या एक स्ट्रिंग हो सकती है। यदि एक कुंजी पूर्णांक का मानक प्रतिनिधित्व है, तो इसे इस तरह से व्याख्या किया जाएगा (अर्थात "8" की व्याख्या 8 के रूप में की जाएगी, जबकि "08" की व्याख्या "08" के रूप में की जाएगी।

परिशिष्ट

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

foo = { '10' : 'bar' };

foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!

107
PHP, सर्वर-साइड IE।
मारेक मौरिजियो

5
ऐसा लगता है कि वास्तव में एक रास्ता है! क्या आप इस जवाब से असहमत हैं? stackoverflow.com/a/35180513/247696
फ्लिम

1
कैसे? .. फू [012] वापसी "बार"
हिमांशु

2
@ हिमान्शु: क्योंकि php संख्या की शुरुआत अष्टक के रूप में 0 से करती है। अतः 012
अष्टम है

49

हां, यह संभव है कि किसी stdClassऑब्जेक्ट को अरेंज करके :

$data =  new stdClass;
$data->{"12"} = 37;
$data = (array) $data;
var_dump( $data );

यह आपको देता है (PHP संस्करण 7.1 तक):

array(1) {
  ["12"]=>
  int(37)
}

(अपडेट: मेरे मूल उत्तर का उपयोग करके अधिक जटिल तरीका दिखाया गया है json_decode()और json_encode()जो आवश्यक नहीं है।)

टिप्पणी पर ध्यान दें : दुर्भाग्य से सीधे मूल्य को संदर्भित करना संभव नहीं है: $data['12']एक नोटिस में परिणाम होगा।

अद्यतन :
PHP 7.2 से इस पर मान के संदर्भ में कुंजी के रूप में एक संख्यात्मक स्ट्रिंग का उपयोग करना भी संभव है:

var_dump( $data['12'] ); // int 32

2
एक स्ट्रिंग कुंजी के साथ मूल्य का प्रत्यक्ष उपयोग हालांकि काम नहीं करता है। इस लाइन को अपने उदाहरण में जोड़ें echo $data['12'];:। यह त्रुटि देगा, "सूचना: अनिर्धारित ऑफसेट: 12 इन - ऑन लाइन 5"।
लोकसभा

1
जब यू लारवेल डीडी ($ डेटा) का उपयोग करेगा तो यह दुर्घटनाग्रस्त हो जाएगा: पी
कामिल कीलवेज़्स्की

2
PHP में 7.2.0RC2 व्यवहार पहले जैसा ही है।
देव ०

1
जाहिरा तौर पर array_key_existsयह पुराने संस्करणों में भी नहीं मिलेगा।
पैनिक

1
7.4 में काम नहीं करता है
चमेली

12

यदि आपको php डेटा संरचना में संख्यात्मक कुंजी का उपयोग करने की आवश्यकता है, तो एक ऑब्जेक्ट काम करेगा। और ऑब्जेक्ट ऑर्डर को संरक्षित करते हैं, इसलिए आप इसे पुन: व्यवस्थित कर सकते हैं।

$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';

यह बहुत अच्छा सुझाव है। मैं फ्रेमवर्क कोड लिख रहा हूं और किसी ऐसे सरणी से गुजरने वाले व्यक्ति का सामना कर रहा हूं जो या तो "आकस्मिक" अनुक्रमण कर सकता है: सरणी ('यह', 'वह') या "साहचर्य" अनुक्रमण: सरणी (123 => सरणी ('यह'), कि '))। अब, आप के लिए धन्यवाद, मैं सिर्फ टाइप कर सकता हूं;) +1
जस्ट प्लेन हाई

लेकिन क्या यह एक PHP सरणी में एक कुंजी के रूप में "123" की तरह एक संख्यात्मक स्ट्रिंग का उपयोग करना संभव है, इसके बिना पूर्णांक में परिवर्तित किया जा सकता है?
फ्लिम

@ ऐसा नहीं है कि संभव नहीं है, यही वजह है कि मैं अपने समाधान की पेशकश करता हूं।
स्टीमपॉवर

@ उत्तर जो PHP मैनुअल के विपरीत लगता है : मान्य पूर्णांक वाले स्ट्रिंग्स को पूर्णांक प्रकार में डाला जाएगा। उदाहरण के लिए "8" वास्तव में 8 के तहत संग्रहीत किया जाएगा। दूसरी ओर "08" को नहीं डाला जाएगा, क्योंकि यह एक वैध दशमलव पूर्णांक नहीं है। , हालांकि मैंने उनके जवाब का परीक्षण नहीं किया है।
भाप से चलने वाली

यह वाक्य "निर्दिष्ट करना" के अंतर्गत है array(), इसलिए मैं यह मान रहा हूं कि उस संदर्भ में मान्य पूर्णांक निर्दिष्ट करने वाले तार पूर्णांक प्रकार पर डाले जाएंगे। लेकिन यह पता चलता है कि सरणियाँ बनाने के अन्य तरीके हैं, जहां ऐसा नहीं होता है। जैसे कि डेविड के उत्तर में, जिसका मैंने परीक्षण किया है।
फ्लिम्स

10

मेरा समाधान है:

$id = 55;
$array = array(
  " $id" => $value
);

स्पेस चार (प्रीपेंड) एक अच्छा समाधान है क्योंकि अंतर रूपांतरण रखें:

foreach( $array as $key => $value ) {
  echo $key;
}

आप 55 को int के रूप में देखेंगे।


4
या "0$id" => $value। कार्यों के साथ 0भी प्रस्तुत करना।
नवाफल

तो आप कह रहे हैं कि "123" जैसे संख्यात्मक स्ट्रिंग को PHP सरणी में एक कुंजी के रूप में उपयोग करना संभव नहीं है, इसके बिना पूर्णांक में परिवर्तित किया जा सकता है?
फ्लिम

5

आप कुंजी को स्ट्रिंग में टाइप कर सकते हैं लेकिन यह अंततः PHP के ढीले-टाइप होने के कारण एक पूर्णांक में परिवर्तित हो जाएगा। अपने आप को देखो:

$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);

PHP मैनुअल से:

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


1
रूपांतरण ढीली टाइपिंग के कारण नहीं है; php यह निर्धारित करता है कि क्या स्ट्रिंग संख्यात्मक दिखती है और फिर इसे परिवर्तित करती है।
͢

1
तो क्या आप कह रहे हैं कि यह संभव नहीं है? यह उत्तर दिखाता है कि एक स्ट्रिंग का उपयोग करने का एक तरीका है जो एक सरणी में एक कुंजी के रूप में पूर्णांक की तरह दिखता है।
फ्लिम

IMHO समस्या PHP दुभाषिया है। ऐसी भाषा की कल्पना करना भी संभव नहीं है जो स्ट्रिंग कुंजियों और पूर्णांक को सरणी कुंजियों के रूप में मिलाती है। सबसे अच्छा समाधान? जैसा कि Undolog stackoverflow.com/ द्वारा प्रस्तावित किया गया है। सबसे अच्छा उपाय एक अनुगामी स्थान का उपयोग करना है ... दुख की बात है।
19-22

@sentenza: यह है की कल्पना करना, खासकर जब से पीएचपी एक सरणी की कुंजी के रूप में तार और पूर्णांकों का एक मिश्रण की अनुमति देता है संभव:[42 => 'answer', 'snafu' => 'fubar']
लोकसभा

@ एलएसपीई। मुझे पता है कि PHP आपको ऐसा करने की अनुमति देता है, लेकिन यदि आप एक काल्पनिक सामान्य प्रकार के सिस्टम में कुंजियों पर विचार करते हैं, तो यह किसी भी मिश्रित प्रकार से मेल नहीं खाएगा जो एक ही समय में तार और संख्या को गले लगाता है। ढीला टाइपिंग एक साहचर्य सरणी की चाबी के लिए आवेदन किया बस का खतरा त्रुटि है।
संतरीजा

1

मुझे यह समस्या एरे को मर्ज करने की कोशिश कर रही थी जिसमें स्ट्रिंग और पूर्णांक कुंजी दोनों थे। यह महत्वपूर्ण था कि पूर्णांक को स्ट्रिंग के रूप में भी संभाला जाएगा क्योंकि ये इनपुट फ़ील्ड (जैसे जूता आकार आदि) के नाम थे।

जब मैंने $data = array_merge($data, $extra);PHP का इस्तेमाल किया तो चाबी को 'री-ऑर्डर' करेगा। ऑर्डर करने की कोशिश में, पूर्णांक कुंजी (मैंने कोशिश की 6- '6'- "6"यहां तक (string)"6"कि कुंजी के रूप में) 0 से नाम बदल दिया गया n... यदि आप इसके बारे में सोचते हैं, तो ज्यादातर मामलों में यह वांछित व्यवहार होगा।

आप $data = $data + $extra;इसके बजाय इसके द्वारा काम कर सकते हैं । बहुत सीधे आगे, लेकिन मैंने पहले ^ ^ पर इसके बारे में नहीं सोचा था।


ठीक उसी समस्या ने मुझे इस पृष्ठ पर पहुँचाया, लेकिन मुझे कहना होगा कि यह ओपी के प्रश्न का उत्तर नहीं है।
फ्लिम

@ फ़ीलम सच। लेकिन एक उत्तर की खोज ने मुझे इस पृष्ठ पर ले गया। मुझे लगा कि मेरा समाधान अन्य Googlers के लिए एक मदद हो सकता है :)
ब्रेनफीडर

1

मान्य पूर्णांक वाले स्ट्रिंग्स को पूर्णांक प्रकार में डाला जाएगा। उदाहरण के लिए "8" वास्तव में 8 के तहत संग्रहीत किया जाएगा। दूसरी तरफ "08" को नहीं डाला जाएगा, क्योंकि यह एक वैध दशमलव पूर्णांक नहीं है।

गलत

मेरे पास एक कास्टिंग फ़ंक्शन है जो साहचर्य सरणी कास्टिंग के अनुक्रमिक को संभालता है,

$array_assoc = cast($arr,'array_assoc');

$array_sequential = cast($arr,'array_sequential');

$obj = cast($arr,'object');

$json = cast($arr,'json');



function cast($var, $type){

    $orig_type = gettype($var);

    if($orig_type == 'string'){

        if($type == 'object'){
            $temp = json_decode($var);
        } else if($type == 'array'){
            $temp = json_decode($var, true);
        }
        if(isset($temp) && json_last_error() == JSON_ERROR_NONE){
            return $temp;
        }
    }
    if(@settype($var, $type)){
        return $var;
    }
    switch( $orig_type ) {

        case 'array' :

            if($type == 'array_assoc'){

                $obj = new stdClass;
                foreach($var as $key => $value){
                    $obj->{$key} = $value;
                }
                return (array) $obj;

            } else if($type == 'array_sequential'){

                return array_values($var);

            } else if($type == 'json'){

                return json_encode($var);
            }
        break;
    }
    return null; // or trigger_error
}

7.4 पीएचपी में काम नहीं करता
चमेली

1

वर्कअराउंड के रूप में, आप JSON_FORCE_OBJECT विकल्प के साथ PHP सरणी को json ऑब्जेक्ट में एन्कोड कर सकते हैं।

इसका उदाहरण,

     $a = array('foo','bar','baz');
     echo "RESULT: ", json_encode($a, JSON_FORCE_OBJECT);

में परिणाम होगा:

     RESULT: {"0" : "foo", "1": "bar", "2" : "baz"}

0

मैं इस समस्या में '0' और '' दोनों कुंजियों के रूप में एक सरणी पर भाग गया। इसका अर्थ था कि मैं अपनी सरणी कुंजियों को या तो == या === से नहीं देख सका।

$array=array(''=>'empty', '0'=>'zero', '1'=>'one');
echo "Test 1\n";
foreach ($array as $key=>$value) {
    if ($key == '') { // Error - wrongly finds '0' as well
        echo "$value\n";
    }
}
echo "Test 2\n";
foreach ($array as $key=>$value) {
    if ($key === '0') { // Error - doesn't find '0'
        echo "$value\n";
    }
}

वर्कअराउंड का उपयोग करने से पहले स्ट्रिंग कुंजियों को स्ट्रिंग्स में डालना है।

echo "Test 3\n";
foreach ($array as $key=>$value) {
    if ((string)$key == '') { // Cast back to string - fixes problem
        echo "$value\n";
    }
}
echo "Test 4\n";
foreach ($array as $key=>$value) {
    if ((string)$key === '0') { // Cast back to string - fixes problem
        echo "$value\n";
    }
}

1
यह वास्तव में सवाल का जवाब नहीं है।
फ्लिम

0

@ डेविड समाधान के संबंध में, कृपया ध्यान दें कि जब आप साहचर्य सरणी में स्ट्रिंग मानों को एक्सेस करने का प्रयास करते हैं, तो संख्याएँ काम नहीं करेंगी। मेरा अनुमान है कि वे पर्दे के पीछे पूर्णांक में डाली जाती हैं (जब सरणी तक पहुंच होती हैं) और कोई मूल्य नहीं मिलता है। मानों को पूर्णांक तक पहुँचना या तो काम नहीं करेगा। लेकिन आप मूल्यों को प्राप्त करने या सरणी को पुनरावृत्त करने के लिए array_shift () का उपयोग कर सकते हैं।

$data = new stdClass;
$data->{"0"} = "Zero";
$data->{"1"} = "One";
$data->{"A"} = "A";
$data->{"B"} = "B";

$data = (array)$data;

var_dump($data);
/*
Note the key "0" is correctly saved as a string:
array(3) {
  ["0"]=>
  string(4) "Zero"
  ["A"]=>
  string(1) "A"
  ["B"]=>
  string(1) "B"
}
*/

//Now let's access the associative array via the values 
//given from var_dump() above:
var_dump($data["0"]); // NULL -> Expected string(1) "0"
var_dump($data[0]); // NULL (as expected)
var_dump($data["1"]); // NULL -> Expected string(1) "1"
var_dump($data[1]); // NULL (as expected)
var_dump($data["A"]); // string(1) "A" (as expected)
var_dump($data["B"]); // string(1) "B" (as expected)

कौन सा PHP संस्करण? मैंने ठीक आपके उदाहरण की कोशिश की और कुंजी php के साथ "0"हो गई । 07.2.10
जे.बिजमाई

-1

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

ASCII चार्ट ( https://en.wikipedia.org/wiki/ASCII ) को देखते हुए विस्मयादिबोधक बिंदु अंतरिक्ष के समान ही है और निश्चित रूप से सभी संख्याओं और अक्षरों से कम है।

इसलिए मैंने कुंजी स्ट्रिंग के अंत में एक विस्मयादिबोधक बिंदु जोड़ा।

for(...) {

    $database[$sha.'!'] = array($sha,$name,$age);
}

ksort($database);
$row = reset($database);
$topsha = $row[0];

तो क्या आप कह रहे हैं कि "123" जैसे संख्यात्मक स्ट्रिंग को PHP सरणी में कुंजी के रूप में उपयोग करना संभव नहीं है, बिना इसे पूर्णांक में परिवर्तित किया जा सकता है?
फ्लिम

नहीं - यह केवल उस कुंजी को मानता है जो ksort () का उपयोग करके सरणी को सॉर्ट करते समय पूर्णांक के रूप में सभी संख्याएँ होती हैं - इसे कभी भी पूर्णांक में परिवर्तित नहीं किया जाता है - केवल छँटाई के दौरान एक की तुलना में।
drchuck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.