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


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

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

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


76
2018-01-22 16:52


मूल




जवाब:


उपयोग array_keys

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

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


162
2018-01-22 16:54



एक जादू की तरह काम करता है। धन्यवाद। - Marty
एक साइड नोट के रूप में, PHP devs एक सरणी तक पहुंचने का इतना गैर-सहज ज्ञान क्यों बनायेगा? - Marty
@ मार्टी के साथ यह कम करने के लिए कम नहीं है कि PHP devs ने इसे कैसे कार्यान्वित किया है, लेकिन सरणी कैसे काम करती है इसकी गलतफहमी के साथ। तकनीकी रूप से, उपरोक्त अभी भी सहयोगी नाम का उपयोग कर रहा है। संख्यात्मक और सहयोगी सूचकांक कुंजी के बीच कोई सहसंबंध नहीं है। - Gordon
आप एक एसोसिएटिव सरणी बनाते हैं क्योंकि आप जो खोज रहे हैं वह सरणी में इसकी स्थिति से अधिक महत्वपूर्ण है। मुझे लगता है कि यह एक अच्छा मुद्दा है। मान लें कि आपके पास कुंजी के रूप में कुंजी और पते के रूप में छात्रों के नाम के साथ एक सरणी है। आप उसके नाम से किसी छात्र के पते तक पहुंच सकते हैं। सरणी की स्थिति यह अप्रासंगिक है। और आप सरणी को सॉर्ट कर सकते हैं name of the student। - Donovan
@ अल्बर्ट आप इस नंबर को उपयुक्त कुंजी स्ट्रिंग पर मैप कर रहे हैं। इसका मतलब यह नहीं है array[1] === $array['foo'] हालांकि। सरणी में अभी भी एक और मूल्य हो सकता है $array[1]। ध्यान दें कि मैं नहीं कह रहा हूं कि आपका समाधान गलत है। यह ओपी की धारणा है। - Gordon


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

जब आप कहते हैं कि आप चाहते हैं कुंजी / मान के सरणी अनुक्रमणिका का उपयोग कर एक सहयोगी सरणी का मान सेट करें, तो आपको दी गई कुंजी, सेटिंग का उपयोग करना होगा $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 पहली सहयोगी कुंजी है जो वास्तविक संख्यात्मक कुंजी के साथ कुछ भी करने के लिए है। बस की तरह some 2 से संबंधित नहीं है।

इसी तरह, ऊपर दिखाए गए मिश्रित सरणी के लिए, समाधान 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

24
2018-01-22 17:22





जबकि array_keys() एनएच कुंजी तक पहुंच की अनुमति देता है, array_values आपको एनएच मूल्य देगा।

<?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() शायद सुरक्षित है।


14
2017-07-01 11:29





एक और संभावना यह है कि इसे सामान्य सरणी में परिवर्तित करना है:

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

जहां "~~~" एक डिलीमीटर है जो आपके डेटा में नहीं होता है।

अब आप ऑफ़सेट के बराबर संख्यात्मक इंडेक्स का उपयोग कर सरणी तक पहुंच सकते हैं।

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


1
2018-01-16 20:46





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

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

1
2017-12-23 07:24



कृपया पुराने थ्रेड पर पोस्ट करते समय सावधान रहें, जिसमें पहले से ही कई प्रतिक्रियाएं हैं और एक स्वीकार्य उत्तर है। आपको यह बताने की जरूरत है कि आपका नया उत्तर मौजूदा लोगों की तुलना में बेहतर क्यों है। - APC
धन्यवाद। @ एपीसी - Murali krishna


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

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

// 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;

1
2017-10-03 12:40