PHP में पूर्णांक सूचकांक द्वारा एक सहयोगी सरणी तक पहुंचना


92

मैं कुंजी / मान युग्म के सरणी सूचकांक का उपयोग करके एक साहचर्य सरणी का मान सेट करना चाहता हूं। उदाहरण के लिए:

$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling";  // Would change the value with key bling2.

यह कुंजी स्ट्रिंग का उपयोग किए बिना इसे कैसे पूरा किया जा सकता है?

जवाबों:


188

Array_keys का उपयोग करें ।

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

उम्मीद है की यह मदद करेगा।


4
एक साइड नोट के रूप में, PHP देवता किसी सरणी तक पहुँचने का ऐसा गैर-सहज तरीका क्यों बनाएंगे?
मार्टी

3
@ इस बात से कम होता है कि PHP देवों ने इसे कैसे लागू किया, लेकिन आपकी गलतफहमी के साथ कि सरणियाँ कैसे काम करती हैं। तकनीकी रूप से, उपरोक्त अभी भी सहयोगी नाम का उपयोग कर रहा है। संख्यात्मक और साहचर्य सूचकांक कुंजी के बीच कोई संबंध नहीं है।
गॉर्डन

2
आप एक साहचर्य सरणी बनाते हैं क्योंकि आप जिस चीज़ की तलाश कर रहे हैं वह सरणी में उसकी स्थिति से अधिक महत्वपूर्ण है। मुझे लगता है कि यह एक अच्छा बिंदु है। मान लें कि आपके पास छात्रों के नाम के साथ एक सरणी है जो मानों के रूप में चाबियाँ और पते हैं। आप किसी छात्र के पते पर उसके नाम से पहुँच सकते हैं। सरणी की स्थिति यह अप्रासंगिक है। और आप सरणी को क्रमबद्ध कर सकते हैं name of the student
डोनोवन

@Gordon तकनीकी रूप से यह सच है। लेकिन प्रोग्रामर एक संख्या प्रदान कर रहा है, न कि एक स्ट्रिंग। मुझे लगता है कि यह अर्थ है without using a key string
डोनोवन

2
@ अल्बर्ट आप इस नंबर को उपयुक्त कुंजी स्ट्रिंग पर मैप कर रहे हैं। array[1] === $array['foo']हालांकि इसका मतलब यह नहीं है । सरणी में अभी भी एक और मान हो सकता है $array[1]। ध्यान दें कि मैं यह नहीं कह रहा हूं कि आपका समाधान गलत है। यह ओपी की धारणा है।
गॉर्डन

27

संख्यात्मक और साहचर्य सूचकांक कुंजी के बीच कोई संबंध नहीं है।

जब आप कहते हैं कि आप कुंजी / मान के सरणी इंडेक्स का उपयोग करके एक साहचर्य सरणी का मान सेट करना चाहते हैं , तो आपको दी गई कुंजी का उपयोग करना होगा, सेटिंग सेटिंग $array[1]के समान नहीं है $array['foo']

इस सरणी पर विचार करें

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );

यह देगा

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)

व्यूह सरणी में दूसरा तत्व है। यह ऑफसेट है , लेकिन इसका इंडेक्स 1 से कोई लेना-देना नहीं है। जैसा कि आप देख सकते हैं कि ऊपर दिए गए एरे में, इंडेक्स 1 के साथ जुड़ा हुआ है baz। यह मानना ​​गलत है कि सिर्फ इसलिए fooकि पहली साहचर्य कुंजी है जिसका वास्तविक संख्यात्मक कुंजी के साथ कुछ भी करना है। ठीक उसी तरह जैसे some2 से संबंध नहीं रखता है।

इसी तरह, ऊपर दिखाए गए एक मिश्रित सरणी के लिए, array_keysइस साइट पर कहीं और सुझाए गए समाधान से काम नहीं चलेगा, क्योंकि

print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );

दे देंगे

Array
(
    [0] => 0
    [1] => foo
    [2] => 1
    [3] => some
)

तो जब आप करते हैं तो $array[$keys[1]]आप वास्तव में कर रहे होते हैं $array['foo']। लेकिन अगर आप उस सरणी ( 'some') में दूसरे साहचर्य मूल्य का उपयोग करना चाहते हैं , तो आप ऐसा नहीं कर सकते $array[$keys[2]]क्योंकि वह मूल्यांकन करेगा $array[1]और वह है baz

किसी तत्व की ऑफसेट कुंजी या मूल्य से पूरी तरह से संबंधित नहीं है

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);

वास्तव में मतलब है

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

जिसका मतलब है कि ऑफसेट 0 में तत्व foo है, हालांकि यह कुंजी 100 है। यदि आप किसी सरणी से ऑफसेट द्वारा तत्वों को निकालना चाहते हैं, तो आपको उपयोग करना होगा

$third = array_splice($array, 2, 1);
echo $third[0]; // baz

यह केवल तीसरी स्थिति में तत्व रखने वाली एक सरणी बनाएगा।

या आप एक का उपयोग कर सकते हैं ArrayIteratorArrayIteratorऔजार एक Seekableअंतरफलक आप एक विशिष्ट स्थान की तलाश करने देता है / सरणी में ऑफसेट और फिर लाने कि:

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

माइनर निट: "अगर आप ( 'कुछ') कि सरणी में दूसरा साहचर्य मूल्य का उपयोग करना चाहता था, आप $ सरणी [$ कुंजी [2]] क्योंकि उस के baz $ सरणी [1] के लिए और है कि मूल्यांकन करेगा ऐसा नहीं कर सकते" तकनीकी तौर पर, ऐसा इसलिए है क्योंकि संख्यात्मक कुंजी सहित सभी कुंजी, साहचर्य कुंजी हैं - द्वारा लौटाए गए 4 मान array_keys। "गैर-सहयोगी कुंजी" के रूप में ऐसी कोई संस्था नहीं है। यदि आपको यह बताने का मतलब है कि आप दूसरी स्ट्रिंग कुंजी को वापस नहीं कर सकते हैं (कुंजी सरणी को संभालने में केवल तार होते हैं), तो आप जो कहते हैं वह सही है। $stringKeys = array_filter(array_keys($array), "is_string");स्ट्रिंग कुंजी देता है।
टूलमेकरसेव

17

Wh जबकि array_keys()nth कुंजी तक पहुंच की अनुमति देता है, array_valuesआपको nth मान देगा।

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

आउटपुट 'दो' होगा।

क्या एक का दूसरे पर फायदा है? खैर, केवल एक मामूली मैं देख सकता हूं कि सरणी एक्सेस की संख्या है।

आपके साथ array_keys()3 की आवश्यकता है।

  1. डेटा ऐरे से कुंजी प्राप्त करें।
  2. कुंजी की सूची से nth कुंजी प्राप्त करें।
  3. डेटा ऐरे से nth कुंजी का उपयोग करके मान प्राप्त करें।

साथ array_values(), आपको केवल 2 की आवश्यकता है।

  1. डेटा सरणी से मान प्राप्त करें।
  2. मूल्यों की सूची से एनटी मान प्राप्त करें।

लेकिन, दूसरी ओर, चाबियाँ सामान्य रूप से छोटी होती हैं और डेटा को बेहद नेस्टेड किया जा सकता है, इसलिए, शेष राशि पर, array_keys()संभवतः उपयोग करना अधिक सुरक्षित है।


3

सरणी बड़ी है, दोनों हैं array_keysऔर array_valuesक्योंकि वे मूल रूप में एक नई सरणी एक ही आकार आवंटित करेगा, बस पाने के लिए बेकार हो जाएगा वें कुंजी (या मूल्य)।

array_sliceएक पूर्णांक ऑफसेट स्वीकार करता है और साहचर्य सरणियों पर काम करता है। आप निरंतर समय में nth कुंजी प्राप्त (और सेट) करने के लिए इसका उपयोग कर सकते हैं ।

// This will at most allocate 2 temporary arrays of 1 element each
$key = array_keys(array_slice($array, $n, 1, true))[0];

$array[$key] = $value;

2
यहाँ अच्छा समाधान!
दान

1

इसे इस्तेमाल करे। यह आपके लिए काम करता है।

$result= array_values($my_arr); // Array with indexes you need

1
कृपया एक पुराने धागे को पोस्ट करते समय सावधान रहें जिसमें पहले से ही कई प्रतिक्रियाएं और एक स्वीकृत उत्तर है। आपको यह समझाने की आवश्यकता है कि आपका नया उत्तर मौजूदा लोगों की तुलना में बेहतर क्यों है।
एपीसी

0

एक और संभावना इसे एक सामान्य सरणी में बदलने की है:

$ arraybuff = implode ("~~~", $ my_arr);
$ my_arr = विस्फोट ("~~~", $ arraybuff);

जहां "~~~" एक सीमांकक है जो आपके डेटा में नहीं होगा।

अब आप संख्याओं के बराबर संख्यात्मक अनुक्रमित का उपयोग करके सरणी तक पहुंच सकते हैं।

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


चूंकि आपको हमेशा और कभी भी विचार करना चाहिए, यह सटीक परिसीमन आपके डेटा में हो सकता है, यह विचार सिर्फ 99.9999999% में काम करता है। ऐसे कई समाधान हैं जो 100% काम करेंगे। बाइसाइड, यह प्रोसेसर को काम करने के लिए सेट करता है और सिर्फ एक सरल उपयोग एक्सेस के लिए मेमोरी को बर्बाद करता है।
user426486
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.