(संभवतः) साहचर्य सरणी में पहली कुंजी प्राप्त करें?


756

संभवतः साहचर्य सरणी में पहली कुंजी निर्धारित करने का सबसे अच्छा तरीका क्या है? मेरा पहला विचार यह है कि यह केवल सरणी को छोड़ दे और फिर तुरंत इसे तोड़ दे, जैसे:

foreach ($an_array as $key => $val) break;

इस प्रकार $ कुंजी होने में पहली कुंजी होती है, लेकिन यह अक्षम लगता है। क्या किसी के पास बेहतर उपाय है?


4
अकुशल क्यों है?
एमिलियो गॉर्ट

2
सभी उत्तरों की तुलना में, फ़ॉरेक्स अभी भी सबसे तेज़ FIDDLE, PHP 5.3 है , PHP 5.5 पर मेरे लोकलहोस्ट परीक्षण से पता चलता है कि अंतर फ़ॉरचेक के पक्ष में थोड़ा भिन्न है।
डेनियल

3
@ दानिश, foreachशब्दार्थ गलत है।
पेसियर

2
@ एलेक्स, each($arr)['key']या each($arr)[0]तो काम करेगा।
पचेरियर

1
@ डैनियल कोई और नहीं ... कुंजी:, 0.01070.0217
फोरचेक

जवाबों:


1337

2019 अपडेट

PHP 7.3 से शुरू होकर , एक नया बनाया गया फंक्शन है, जिसे array_key_first()आंतरिक पॉइंटर को रीसेट किए बिना दिए गए एरे से पहली कुंजी प्राप्त होगी। की जाँच करें प्रलेखन अधिक जानकारी के लिए।


आप उपयोग कर सकते हैं resetऔर key:

reset($array);
$first_key = key($array);

यह अनिवार्य रूप से आपके प्रारंभिक कोड के समान है, लेकिन थोड़ा कम ओवरहेड के साथ, और यह अधिक स्पष्ट है कि क्या हो रहा है।

बस फोन करने के लिए याद resetहै, या आप सरणी में कुंजी के किसी भी मिल सकता है। आप अंतिम कुंजी प्राप्त करने के endबजाय उपयोग कर सकते हैं reset

यदि आप पहले मूल्य प्राप्त करने के लिए कुंजी चाहते हैं, तो resetवास्तव में इसे लौटाता है:

$first_value = reset($array);

हालांकि देखने के लिए एक विशेष मामला है (इसलिए पहले सरणी की लंबाई की जांच करें):

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)

141
एक साइड नोट के रूप में, reset()किसी भी सरणी के पहले तत्व (मान, कुंजी नहीं) को वापस करने के लिए भी होता है, जो कि आसान भी हो सकता है।
devios1

5
वहाँ के लिए डॉक्स में एक टिप्पणी है reset()कह Don't use रीसेट () `एक साहचर्य सरणी के पहले मूल्य मिलता है। यह सच्चे सरणियों के लिए बहुत अच्छा काम करता है, लेकिन Iterator वस्तुओं पर अप्रत्याशित रूप से काम करता है। Bugs.php.net/bug.php?id=38478 `क्या यह अभी भी सच है? मैं भ्रमित हूं
दिमित्री पश्केविच

13
@DmitryPashkevich: उस टिप्पणी के बारे में चिंता न करें। वे arrayवस्तुओं के बारे में बात नहीं कर रहे हैं, लेकिन कस्टम ऑब्जेक्ट्स (जो वास्तविक सरणियाँ नहीं हैं)। मुझे लगता है कि उन्हें भ्रमित डेटा संरचनाओं में अंतर मिला, लेकिन मूल रूप से, resetपहले "कुंजी" का मूल्य देता है, जो वस्तुओं $propके लिए "बग" रिपोर्ट में दिए गए उदाहरण में होगा , लेकिन एक सरणी के लिए पहली कुंजी। तो चिंता न करें, जब तक आप वास्तविक सरणियों का उपयोग करते हैं (साथ बनाया गया array(…)), आपको कोई समस्या नहीं होगी।
ब्लिक्स

2
यह उल्लेख किया जाना चाहिए कि अंत () और रीसेट () का साइड इफेक्ट है। हालांकि, दुनिया में अधिकांश कोड आंतरिक पॉइंटर पर कहीं भी निर्भर नहीं करता है, इसलिए यह आमतौर पर कोई समस्या नहीं है।
दान

1
@ user3019105 केवल एक सरणी प्रति आंतरिक सूचक है, जो अर्थ यह है कि यदि आपके समारोह के बाहर किसी भी कोड यह परिवर्तन (फोन करके है next, reset, endया सरणी के माध्यम से पाशन), तो आप उम्मीद मूल्य नहीं मिलेगा जब आप कॉल key। तो हाँ, हमेशा फोन resetउपयोग करने से पहले keyसुनिश्चित करें कि आप आप क्या चाहते हैं पाने के किया जाना है।
ब्लिक्स

80

array_keysकुंजियों की एक सरणी देता है। पहले प्रवेश ले लो। वैकल्पिक रूप से, आप resetसरणी पर और बाद में कॉल कर सकते हैं key। उत्तरार्द्ध दृष्टिकोण शायद थोड़ा तेज है (Thoug I ने इसका परीक्षण नहीं किया है), लेकिन इसका आंतरिक सूचक रीसेट करने का दुष्प्रभाव है।


52
भविष्य के पाठकों के लिए बस (देर से) नोट: बाद का दृष्टिकोण सिर्फ "थोड़ा" तेज नहीं है। एक संपूर्ण सरणी को पुनरावृत्त करने के बीच एक बड़ा अंतर है, हर कुंजी को एक और नए बनाए गए सरणी में संग्रहीत करना, और एक स्ट्रिंग के रूप में एक सरणी की पहली कुंजी का अनुरोध करना।
ब्लक्ष्ट

3
क्यों अयोग्य है क्योंकि ऑप इन सभी उत्तरों की तुलना करता है?
एमिलियो गॉर्ट

5
@EmilioGort अच्छा प्रश्न। मुझे नहीं लगता कि वास्तव में foreach+ breakऔर reset+ के प्रदर्शन में कोई अंतर है key। लेकिन पूर्व अजीब लगता है, इसलिए शैलीगत मुद्दों के लिए, मैं बाद वाला पसंद करूंगा।
troelskn

@EmilioGort: Afaik, foreach () सरणी को आंतरिक रूप से कॉपी करता है। तो हम इसे धीमा मान सकते हैं। (अच्छा होगा यदि कोई इसकी पुष्टि कर सके)
दान करें

3
@donquixote मुझे निश्चित रूप से ज्ञात नहीं है, लेकिन यह एक नियमित सरणी है (और किसी प्रकार या इरेटर इंटरफ़ेस को लागू करने वाली वस्तु नहीं है), मुझे पूरा यकीन foreachहै कि इसके लिए कोई आंतरिक प्रतिलिपि नहीं बनाई गई है, बल्कि केवल एक पॉइंटर को पुनरावृत्त करता है , अधिक निम्न-स्तर का उपयोग करने के लिए समान है next, currentआदि
troelskn

54

दिलचस्प रूप से पर्याप्त है, फॉर्च लूप वास्तव में ऐसा करने का सबसे कुशल तरीका है।

चूंकि ओपी ने विशेष रूप से दक्षता के बारे में पूछा था, इसलिए यह ध्यान दिया जाना चाहिए कि सभी वर्तमान उत्तर वास्तव में एक फॉर्च्यूनर की तुलना में बहुत कम कुशल हैं।

मैंने php 5.4 के साथ इस पर एक बेंचमार्क किया था, और रीसेट / कुंजी पॉइंटर विधि (स्वीकृत उत्तर) एक फ़ॉरच की तुलना में लगभग 7 गुना धीमी लगती है। अन्य पूरे सरणी से छेड़छाड़ दृष्टिकोण (array_keys, array_flip) स्पष्ट रूप से भी धीमी है कि तुलना में कर रहे हैं और बन ज्यादा है जब एक बड़ी सरणी के साथ काम करने से भी बदतर।

Foreach बिल्कुल भी अक्षम नहीं है, इसका उपयोग करने के लिए स्वतंत्र महसूस करें!

2015-03-03 संपादित करें:

बेंचमार्क स्क्रिप्ट का अनुरोध किया गया है, मेरे पास मूल नहीं हैं लेकिन इसके बजाय कुछ नए परीक्षण किए हैं। इस बार मैंने फॉर्च्यूनर को केवल दो बार तेजी से रीसेट / कुंजी के रूप में पाया। मैंने 100-कुंजी सरणी का उपयोग किया और प्रत्येक विधि को कुछ ध्यान देने योग्य अंतर प्राप्त करने के लिए एक लाख बार भाग लिया, यहाँ सरल बेंचमार्क का कोड है:

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";


for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

मेरे php 5.5 पर यह आउटपुट:

foreach to get first key and value: 0.15501809120178 seconds 
reset+key to get first key and value: 0.29375791549683 seconds 
reset+key to get first key: 0.26421809196472 seconds 
array_keys to get first key: 10.059751987457 seconds

रीसेट + कुंजी http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs


3
क्या आपके पास कहीं बेंचमार्क हैं। जैसा आप कैसे परीक्षण किया आदि वैसे भी, उन्हें चलने के लिए धन्यवाद!
फ़्लू

मैं इस तथ्य को इंगित करना चाहूंगा, कि पूरे परीक्षण के माध्यम से एक ही सरणी का उपयोग किया जाता है। मुझे लगता है कि यह तथ्य महत्वपूर्ण रूप से फॉर्च्यून दृष्टिकोण को प्रभावित करता है। जैसा कि @donquixote ने ऊपर कुछ प्रतिक्रिया के लिए टिप्पणी में उल्लेख किया है - foreach आंतरिक रूप से सरणी की प्रतिलिपि बनाता है। मैं कल्पना कर सकता हूं कि यह प्रतिलिपि बेंचमार्क चलाते समय पुन: उपयोग की जाती है क्योंकि सरणी कॉपी से बचने से केवल इस परीक्षण के भीतर प्रदर्शन में वृद्धि होती है।
जर्दा

2
@ जार्दा php7 के रूप में, foreachजब तक आप सीधे इसे फॉरेस्ट लूप के अंदर संशोधित नहीं करते हैं, कभी भी उस सरणी की प्रतिलिपि नहीं बनाते हैं । Php5 पर सरणी संरचना को कुछ मामलों में कॉपी किया जा सकता है (जब इसका प्रतिक्षेपक> 1) और आप वास्तव में सही हैं तो यह एक महत्वपूर्ण प्रभाव हो सकता है। सौभाग्य से यह php7 के बारे में चिंता करने के लिए कुछ भी नहीं है, जहां इस मुद्दे को हल किया गया था। यहाँ एक महान पढ़ा है कि दोनों कैसे हूड के तहत काम करते हैं और यह अतीत में कैसे काम करता है।
वेबमुट

2
उपरोक्त बेंचमार्क का उपयोग करते हुए php7.2 के रूप में, फ़ॉरेच अभी भी सबसे तेज़ है
बिलीनाह

36

key($an_array) आपको पहली कुंजी देगा

प्रति Blixt को संपादित करें: आपको सूचक को सरणी की शुरुआत में रीसेट करने reset($array);से पहले कॉल करना चाहिए key($an_array)


7
याद रखें कि सरणी का सूचक पहले तत्व पर नहीं हो सकता है, मेरा उत्तर देखें।
ब्लिक्स

मुझे लगता है कि यह उत्तर बिना रीसेट के मेरे मामले में मदद करेगा क्योंकि मैं पहली बार यह सुनिश्चित कर रहा हूं कि सरणी में केवल एक तत्व है। धन्यवाद
ग्रूवेनटेकर


22

2018+ के लिए

PHP 7.3 के साथ शुरू, एक ऐसा array_key_first()कार्य है जो वास्तव में इसे प्राप्त करता है:

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'

प्रलेखन यहाँ उपलब्ध है । 😉


21
list($firstKey) = array_keys($yourArray);

2
यह शायद सबसे कुशल नहीं है।
यदा

3
@ यदा, हाँ, लेकिन यह दुर्लभ मामलों में ध्यान देने योग्य हो सकता है; ज्यादातर मामलों पठनीयता और रख-रखाव में बहुत अधिक महत्व के हैं; और मैं उन समाधानों को भी प्राथमिकता देता हूं जो मूल वस्तुओं / सरणियों को म्यूट नहीं करते हैं: उदाहरण के लिए रीसेट ($ ar); $ कुंजी = कुंजी ($ ar); - हमेशा अच्छा विचार नहीं है, मैंने मार्टीक्स के समाधान को चुना है जो कि मेरी तुलना में अधिक संक्षिप्त है, जैसे: array_keys ($ ar) [0];
सर्गी सोकोलेन्को

20

यदि दक्षता आपके लिए महत्वपूर्ण नहीं है, तो आप array_keys($yourArray)[0]PHP 5.4 (और उच्चतर) में उपयोग कर सकते हैं ।

उदाहरण:

# 1
$arr = ["my" => "test", "is" => "best"];    
echo array_keys($arr)[0] . "\r\n"; // prints "my"


# 2
$arr = ["test", "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "0"

# 3
$arr = [1 => "test", 2 => "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "1"

समाधान पर लाभ:

list($firstKey) = array_keys($yourArray);

वह यह है कि आप array_keys($arr)[0]फ़ंक्शन पैरामीटर (यानी doSomething(array_keys($arr)[0], $otherParameter)) के रूप में पास कर सकते हैं ।

HTH


3
क्या array_keys($arr)[0]वाक्य रचना वैध है?

5
यह PHP 5.4 में है। इसे कहते हैं array dereferencing। उदाहरण के लिए देखें: schlueters.de/blog/archives/…
मार्टिन विसेटिका

@trante, यह PHP <5.4 को छोड़कर सूरज के नीचे हर भाषा में मान्य है।
3


12
$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1

1
@jurgemaister max()खुराक एक एशोक सरणी की पहली कुंजी नहीं लौटाती है । अधिकतम एक सूची या एक सरणी आइटम का अधिकतम मूल्य
हमीद्रेजा

5
ओपी अनुरोध नहीं, लेकिन कुछ स्थितियों में बहुत उपयोगी है।
d.raev

9

यह भी एक समाधान हो सकता है:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;

मैंने इसका परीक्षण किया है और यह काम करता है।

कार्य कोड


3
array_flip (): केवल STRING और INTEGER मान फ्लिप कर सकते हैं!
मौरो

5

Webmut के समाधान को बढ़ाने के लिए , मैंने निम्नलिखित समाधान जोड़ा है:

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

PHP 7.1 पर मेरे लिए आउटपुट है:

foreach to get first key and value: 0.048566102981567 seconds 
reset+key to get first key and value: 0.11727809906006 seconds 
reset+key to get first key: 0.11707186698914 seconds 
array_keys to get first key: 0.53917098045349 seconds 
array_slice to get first key: 0.2494580745697 seconds 

अगर मैं 10000 की एक सरणी के लिए ऐसा करता हूं, तो परिणाम बन जाते हैं

foreach to get first key and value: 0.048488140106201 seconds 
reset+key to get first key and value: 0.12659382820129 seconds 
reset+key to get first key: 0.12248802185059 seconds 
array_slice to get first key: 0.25442600250244 seconds 

Array_keys विधि का समय 30 सेकंड पर है (केवल 1000 तत्वों के साथ, बाकी के लिए समय समान था, लेकिन array_keys विधि में लगभग 7.5 सेकंड था)।


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

3

मेरे लिए सबसे अच्छा तरीका था काम करना

array_shift(array_keys($array))

array_keys प्रारंभिक सरणी से कुंजियों का सरणी प्राप्त होता है और फिर array_shiftपहले तत्व मान से कट जाता है। इसके लिए आपको PHP 5.4+ की आवश्यकता होगी।


3

यह आसान तरीका है जो मैंने कभी पाया था। कोड की तेज़ और केवल दो पंक्तियाँ :-D

$keys = array_keys($array);
echo $array[$keys[0]];

2

php73:

$array = ['a' => '..', 'b' => '..'];

array_key_first($array); // 'a'
array_key_last($array); // 'b';

http://php.net/manual/en/function.array-key-first.php


1
स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है
माइकलवी


0

आज मुझे अपने सरणी की पहली कुंजी POST अनुरोध द्वारा वापस लौटानी थी। (और फॉर्म आईडी आदि के लिए नंबर नोट करें)

खैर, मैंने यह पाया है: PHP में साहचर्य सरणी की पहली कुंजी लौटें

http://php.net/key

मैंने यह किया है, और यह काम करता है।

    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

शायद यह एक दूसरे आदमी का इको 15min होगा। CYA।


-2

आप अपने ऐरे से खेल सकते हैं

$daysArray = array('Monday', 'Tuesday', 'Sunday');
$day = current($transport); // $day = 'Monday';
$day = next($transport);    // $day = 'Tuesday';
$day = current($transport); // $day = 'Tuesday';
$day = prev($transport);    // $day = 'Monday';
$day = end($transport);     // $day = 'Sunday';
$day = current($transport); // $day = 'Sunday';

सरणी का पहला तत्व प्राप्त करने के लिए आप उपयोग कर सकते हैं currentऔर अंतिम तत्व के लिए आप उपयोग कर सकते हैंend

संपादित करें

उत्तर के लिए कोई और अधिक डाउन वोट न पाने के लिए, आप array_keysऊपर दिखाए अनुसार उपयोग करने और उपयोग करने के लिए कुंजी को परिवर्तित कर सकते हैं।


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