किसी सरणी में अंतिम कुंजी कैसे प्राप्त करें?


335

मुझे किसी सरणी की अंतिम कुंजी कैसे मिल सकती है?


10
साहचर्य सरणी, संख्यात्मक सरणी निर्दिष्ट करना चाहिए, या दोनों पर काम करना होगा।
जिम्बो जॉनी

अक्सर पूछे जाने वाले प्रश्न
जोशुआ मार्सेल क्रिसानो

जवाबों:


610

एक समाधान के संयोजन का उपयोग करने के लिए किया जाएगा endऔर (के हवाले से) :key

  • end() अंतिम तत्व के लिए सरणी के आंतरिक पॉइंटर को आगे बढ़ाता है, और उसका मूल्य लौटाता है।
  • key() वर्तमान सरणी स्थिति के सूचकांक तत्व को लौटाता है।

तो, कोड का एक हिस्सा जैसे कि यह एक चाल करना चाहिए:

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

end($array);         // move the internal pointer to the end of the array
$key = key($array);  // fetches the key of the element pointed to by the internal pointer

var_dump($key);

उत्पादन होगा:

string 'last' (length=4)

यानी मेरे ऐरे के अंतिम तत्व की कुंजी।

इसके बाद किया गया है सरणी का आंतरिक पॉइंटर सरणी के अंत में होगा। जैसा कि टिप्पणियों में बताया गया है, आप reset()सूचक को सरणी की शुरुआत में वापस लाने के लिए सरणी पर चलाना चाह सकते हैं ।


17
@Pim: पर निर्भर करता है कि ओपी उस एरे के साथ क्या करना चाहता है (कॉल करने की आवश्यकता नहीं हो सकती है reset()) ;; लेकिन आप उस फ़ंक्शन को इंगित करने में सही हैं, जो उपयोगी हो सकता है।
पास्कल मार्टिन

3
@PascalMARTIN +1 मुझे लगता है कि आपके उत्तर में रीसेट () के बारे में एक टिप्पणी जोड़ना बहुत मददगार होगा।
लुलु

यदि सरणी में डुप्लिकेट मान हैं, तो यह दृष्टिकोण काम नहीं करता है। जैसे। क्योंकि array('a', 'b', 'c', 'd', 'a')यह ० की बजाय ४ कुंजी देगा।
मार्क

2
@ इस दृष्टिकोण सही ढंग से काम करता है, भले ही डुप्लिकेट मूल्य हो।
जेफ

1
@ यह काम नहीं करता है क्योंकि ... जाँच करें कि क्या अंत () रिटर्न और फिर लगता है?)
forsberg

79

हालांकि end()यह सबसे आसान लगता है, यह सबसे तेज़ नहीं है। तेज और अधिक मजबूत विकल्प है array_slice():

$lastKey = key(array_slice($array, -1, 1, true));

जैसा कि परीक्षण कहते हैं , 500000 तत्वों के साथ एक सरणी पर, यह लगभग 7x तेज है!


98
इस उत्तर से उत्साहित होकर, मैंने 100,000 पुनरावृत्तियों का त्वरित परीक्षण किया, (a) के end($arr);$key = key($arr);reset($arr);विरुद्ध (b) की तुलना की $key = key(array_slice($arr,-1,1,true));... जिसके परिणामस्वरूप end()MUCH अधिक तेज़ हो गया! अंत () = 0.05326 सेकंड, array_slice = 8.506 सेकंड ... हुह ??
नियोको

54
PHP के बिल्ट-इन फ़ंक्शंस अत्यधिक नर्ड द्वारा बनाए गए थे। उन कार्यों को फिर से बनाने की कोशिश न करें। बाधाओं यह है कि आप मूल की तुलना में कुछ धीमी बनाते हैं। जब तक आप किसी प्रकार के दुष्ट जादूगर, couse के हैं।
dmmd

16
end()सबसे तेज़ है क्योंकि यह एक बहुत ही सरल सी-फ़ंक्शन से लिया जा सकता है, जैसे:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
गुस्ताव

10
@ गुस्ताव मेरा मानना ​​है कि पीएचपी के अंतर्निहित सी-कार्यान्वयन, वास्तव lastमें अंतिम तत्व के लिए एक आंतरिक सूचक है। end()बहुत अधिक ओ (१) बनाना । :-)
एरिक

15
@dmmd, मुझे यकीन है कि PHP टीम अत्यधिक प्रसन्न होगी जिसे वे नर्ड कहते हैं।
datasn.io

53

मैं पसंद करता हूं

end(array_keys($myarr))

19
STRICT नोटिस का कारण बनता है, अंत में एक परिवर्तनीय संदर्भ की उम्मीद है
विलीम

25
आप end((array_keys($myarr)))नोटिस के आसपास पाने के लिए उपयोग कर सकते हैं ।
बेन फॉर्च्यून

9
@BenFortune यह PHP7 में तय किया गया है: "PHP 5 में, फ़ंक्शन पैरामीटर के आसपास निरर्थक कोष्ठक का उपयोग करने से सख्त मानकों को शांत किया जा सकता है जब फ़ंक्शन पैरामीटर को संदर्भ द्वारा पारित किया गया था। चेतावनी अब हमेशा जारी की जाएगी।"
डोमिनिक शेहर्लिनक

यह पूरी तरह से अनावश्यक चेतावनी है! यह अन्य सभी भाषाओं में ऐसा सामान्य और सामान्य सामान है!
azerafati

1
अन्य भाषाओं में, फ़ंक्शन पॉइंटर्स पर काम नहीं करते हैं, क्या वे करते हैं?
जर्किक्स

52

चूंकि PHP 7.3 (2018) इसके लिए (अंत में) कार्य है: http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

उत्पादन होगा

orange

4
Horray! मैं इस उत्तर को जोड़ने वाला था। क्या आप "PHP 7.3" संस्करण और 2018 वर्ष को उजागर कर सकते हैं? दूसरों के लिए इस भयानक समाचार को
देखना

यह भी उल्लेख करना अच्छा है कि यह आंतरिक सरणी सूचक को प्रभावित नहीं करता है।
मावेरेसेक

30

महज प्रयोग करें : echo $array[count($array) - 1];


75
यह केवल तभी काम करता है जब आपके पास संख्यात्मक सरणियाँ हों। सहयोगी सरणियों के साथ विफल रहता है।
जेरेमी जे स्टारचेर सेप

12
न केवल यह केवल संख्यात्मक सरणियों पर काम करता है, यह कुंजी दिखाने में विफल रहता है, लेकिन मूल्य दिखाता है, है ना?
नन्ने

मुझे भी जेक, क्या हम एक ऐसा काम कर सकते हैं जहां हम इसे विभाजित करते हैं (ईमानदार होने देता है) शीर्ष Google संख्यात्मक और साहचर्य दोनों में हिट होता है ताकि हमारे पास दोनों के लिए एक पुराना संदर्भ हो ... मैंने केवल काम किया है यह पार्स करने के बाद गधे के लिए था int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }जो है दिलचस्प है लेकिन व्यवसाय के लिए अच्छा नहीं है जब आप एक समय के बजट पर हों
lol

5
इसके अलावा, यहां तक ​​कि एक संख्यात्मक सरणी के लिए, ध्यान रखें कि संख्यात्मक सरणियों को क्रम में जाने की जरूरत नहीं है, या सभी संख्याओं का उपयोग न करें। यदि आप संख्यात्मक मानों को स्पष्ट रूप से निर्दिष्ट नहीं करते हैं तो यह काम करेगा, लेकिन यदि आप करते हैं $a[1] = 1; $a[5] = 5; $a[0] = 0;तो आपके पास उस क्रम में कुंजियों (1, 5, 0) के साथ एक सरणी होगी। count($a)3 उपज देगा और $a[2]परिभाषित नहीं है। यह निश्चित रूप से आपको 5 वापस नहीं देता है।
डैनियल स्कारबेक

1
प्रश्न फिर से पढ़ें " सरणी में अंतिम कुंजी कैसे प्राप्त करें ?"

20

पता नहीं कि यह तेजी से हो रहा है या नहीं, लेकिन यह इस तरह से करना आसान लगता है, और आप समाप्त होने के लिए एक फ़ंक्शन में नहीं गुजरने से त्रुटि से बचते हैं () ...

यह सिर्फ एक चर की जरूरत है ... कोड की एक और पंक्ति लिखने के लिए एक बड़ी बात नहीं है, फिर यदि आप की जरूरत है तो इसे परेशान करें।

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);

2
यह उत्तर (जबकि तकनीकी रूप से सही है) बेकार / अक्षम है, क्योंकि इसके लिए एक अतिरिक्त सरणी (मूल के रूप में समान लंबाई) के निर्माण की आवश्यकता होती है। इसका मतलब है कि अपशिष्ट बढ़ता है जैसा कि मूल सरणी करता है। इसे पास्कल मार्टिन के कुशल उत्तर पर कभी नहीं चुना जाना चाहिए। मुझे आश्चर्य है कि इसमें इतने उतार-चढ़ाव हैं।
मिकमैकुसा

12

PHP7.3 के रूप में आप array_key_last () के साथ एक सरणी में अंतिम कुंजी (बाहरी स्तर) तक सीधे पहुंच सकते हैं

निश्चित रूप से इस पृष्ठ पर बहुत सारी बहस बिस्तर पर डालती है। यह सर्वश्रेष्ठ प्रदर्शन करने वाले का हाथ है, इसका कोई दुष्प्रभाव नहीं है, और यह प्रश्न पूछने के लिए प्रत्यक्ष, सहज, एकल-कॉल तकनीक है।

प्रमाण के रूप में एक मोटा बेंचमार्क: https://3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

* परीक्षण सरणी में 500000 तत्व होते हैं, माइक्रोटाइम 100x दोहराया जाता है, फिर वैज्ञानिक संकेतन से बचने के लिए औसत 1000 से गुणा किया जाता है। शुरुआती बेंचमार्क के लिए @MAChitgarha को क्रेडिट @ TadejMagajna के जवाब के तहत टिप्पणी की

इसका मतलब है कि आप बिना अंतिम कुंजी के मूल्य को पुनः प्राप्त कर सकते हैं:

  1. सरणी पॉइंटर को ले जाना (जिसमें कोड की दो लाइनों की आवश्यकता होती है) या
  2. छँटाई, उलटना, पॉपिंग, गिनती, कुंजियों की एक सरणी अनुक्रमण, या किसी भी अन्य कब्रिस्तान

यह फ़ंक्शन लंबे समय से अतिदेय था और प्रदर्शन में सुधार करने वाले सरणी फ़ंक्शन टूल बेल्ट के लिए एक स्वागत योग्य अतिरिक्त है, अवांछित दुष्प्रभावों से बचा जाता है, और स्वच्छ / प्रत्यक्ष / सहज ज्ञान युक्त कोड को सक्षम करता है।

यहाँ एक डेमो है :

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

आउटपुट:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

कुछ नोट:

  • array_key_last()array_key_first () का सिबलिंग फ़ंक्शन है ।
  • ये दोनों कार्य "पॉइंटर-अज्ञानी" हैं।
  • nullयदि सरणी खाली है, तो दोनों फ़ंक्शन वापस आ जाते हैं ।
  • त्याग किए गए भाई-बहनों के कार्यों ( array_value_first()और array_value_last()) ने सूचक तत्वों को अज्ञानी तक पहुँचाने की पेशकश की होगी, लेकिन वे स्पष्ट रूप से जीवन में आने के लिए पर्याप्त वोट हासिल करने में असफल रहे।

नई विशेषताओं पर चर्चा करने वाले कुछ प्रासंगिक पृष्ठ इस प्रकार हैं:

ps यदि कोई किसी अन्य तकनीक का वजन कर रहा है, तो आप तुलना के इस छोटे संग्रह का उल्लेख कर सकते हैं: ( डेमो )

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408

2
यह उत्तर सूची के शीर्ष पर होना चाहिए। यह बस पूरा हो गया है।
जॉन

1
वाह, एक DV मेरा यह जवाब पर? क्या मामला था, बहुत व्यापक / निश्चित / व्याख्यात्मक / समर्थित? Pfft। निश्चित रूप से ऐसे पोस्टों को पुश करना जारी रखें जो सूचित करने का साहस करते हैं। बहुत बढ़िया। यदि आप नहीं जानते हैं, तो DV बटन उन पदों के लिए है जो "उपयोगी नहीं हैं"। कृपया अपने आप से पूछें कि आपका लक्ष्य यहाँ क्या है।
मिकमैकुसा

8

इस प्रकार array_pop और array_keys फ़ंक्शन का उपयोग करने का प्रयास करें :

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>

14
यह वास्तव में धीमा है अगर आपके सरणी में 1 से अधिक चीज है। कृपया ऐसा न करें।
एंड्री

3
और STRICT नोटिस भी, चर संदर्भ
Wiliam

array_pop () मूल सरणी को छोटा करेगा (अंतिम तत्व को हटाते हुए)। मुझे यकीन नहीं है कि यह ओपी के लिए मायने रखता है या नहीं लेकिन दूसरों के लिए निश्चित रूप से मायने रखेगा।
प्रोग्रामर

1
ज़रुरी नहीं। इस उदाहरण में array_pop()की वापसी मूल्य पर चल रही है array_keys()और नहीं मूल सरणी पर।
पेटको बोसाकोव

क्योंकि अन्य अधिक कुशल उत्तर हैं जो नोटिस को ट्रिगर नहीं करते हैं, मैं इस उत्तर को अस्वीकार कर रहा हूं।
मिकमैकुसा

6

PHP के रूप में = = 7.3 array_key_last()किसी भी सरणी के अंतिम कुंजी प्राप्त करने का सबसे अच्छा तरीका है। के संयोजन का उपयोग करना end(), key()और reset()सिर्फ एक सरणी के अंतिम कुंजी पाने के लिए अपमानजनक है।

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

की तुलना करें

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

यदि आप के संयोजन का उपयोग कर रहे सूचक शुरुआत में होने के लिए सरणी रीसेट करना होगा end()औरkey()


4

मैं इस समस्या का वैकल्पिक समाधान भी प्रस्तुत करना चाहूंगा।

यह मानते हुए कि आपकी सभी कुंजियाँ बिना किसी अंतराल के संख्यात्मक हैं, मेरा पसंदीदा तरीका यह है कि उस मान से तब 1 माइनस 1 की गणना करें (इस तथ्य पर ध्यान दें कि ऐरे कुंजियाँ 0 से शुरू होती हैं।

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

यह आपको देगा:

int (1) बिल्ली


1
यह सरणी के लिए काम नहीं करेगा जहाँ कुंजियाँ वृद्धिशील नहीं हैं उदाहरण के लिए सरणी (0 => 'कुत्ता', 5 => 'बिल्ली'); $ lastKey एक गलत मान लौटाएगा
काकोमा

@ काकोमा - जैसा कि मेरी पोस्ट कहती है कि "आपकी सभी कुंजियाँ बिना किसी अंतराल के संख्यात्मक हैं"।

कोई भी जो चमत्कार के लिए संख्यात्मक अनुक्रमिक सरणी को फिर से शुरू करने के लिए PHP के "array_values" का उपयोग करता है। php.net/manual/en/function.array-values.php

1
क्योंकि यह उत्तर केवल सरणी संभावनाओं (संख्यात्मक, लगातार बंद सरणियों) के एक अंश से संबंधित है, यह उत्तर ओपी के सामान्यीकृत प्रश्न का एक मजबूत / सही उत्तर प्रदान नहीं करता है। Downvote।
मिकमैकुसा

4

आप इसका उपयोग कर सकते हैं:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

एक अन्य समाधान एक समारोह बनाने और इसका उपयोग करने के लिए है:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);

1
यह उत्तर कुछ भी नया नहीं प्रदान करता है जो पहले से ही इस धागे में नहीं है।
मार्टिन

1
मार्टिन, परिणाम प्राप्त करने के लिए कोई भी फ़ंक्शन का उपयोग नहीं करता है।
आतिफ तारिक

1
क्या आपको किसी फ़ंक्शन में कोड की 1 पंक्ति जोड़ने की आवश्यकता है? यह एक बजाय जरूरतमंद इंटरफ़ेस है।
मार्टिन

1
मार्टिन, जो एक पंक्ति है।
आतिफ तारिक

2
अपने समारोह में लाइन
मार्टिन

3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3

2
केवल एक मान खींचने के लिए पूरे सरणी को उलट देना निश्चित रूप से PascalMARTIN की विधि से कम कुशल है। भले ही यह तकनीकी रूप से सही है, इसे पास्कल के दृष्टिकोण के स्थान पर कभी भी उपयोग नहीं किया जाना चाहिए।
मिकमैकुसा

3

मैंने अभी-अभी Xander से हेल्पर-फंक्शन लिया और पहले के जवाबों के साथ इसमें सुधार किया:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));

1

इस के साथ एक कोशिश करो array_reverse()

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);

1

यह अजीब है, लेकिन इस विषय का यह जवाब क्यों नहीं है:

$lastKey = array_keys($array)[count($array)-1];


0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

यह काम करता है क्योंकि PHP चाल यह सरणी सूचक आंतरिक रूप से $ सरणी के लिए है


2
यह PascalMARTIN की विधि का डुप्लिकेट है। कृपया इस पृष्ठ को छोड़ दें और अपने देर से / डुप्लिकेट उत्तर को हटा दें। Downvoted।
मिकमैकुसा

0

सबसे अच्छा संभव समाधान जिसका उपयोग इनलाइन भी किया जा सकता है:

end($arr) && false ?: key($arr)

यह समाधान केवल अभिव्यक्ति / कथन है और अच्छा प्रदान करना सर्वोत्तम संभव प्रदर्शन नहीं है।

इनलाइन उदाहरण उपयोग:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


अद्यतन: PHP 7.3+ में: (निश्चित रूप से) नव जोड़ा array_key_last()विधि का उपयोग करें।

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