एक सहयोगी PHP सरणी से पहला आइटम कैसे प्राप्त करें?


146

अगर मेरे पास एक सरणी है जैसे:

$array['foo'] = 400;
$array['bar'] = 'xyz';

और मैं इसके लिए कुंजी जानने के बिना उस सरणी से पहला आइटम प्राप्त करना चाहता था, मैं यह कैसे करूंगा? क्या इसके लिए कोई फ़ंक्शन है?


जवाबों:


288

reset() यदि आप सरणी के अंदर एक तत्व है, तो आपको सरणी का पहला मूल्य देता है:

$value = reset($array);

FALSEसरणी खाली होने की स्थिति में भी यह आपको देता है।


नोट करने के लिए:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole

रीसेट फ़ंक्शन पर अधिक जानकारी: www.w3schools.com/php/func_array_reset.asp
पॉल क्रिस जोन्स

क्या होगा यदि मैं कुंजी और मूल्य प्राप्त करना चाहता हूं?
टिम्बरमैन

51

PHP <7.3

यदि आप सरणी के बारे में पर्याप्त नहीं जानते हैं (आपको यकीन नहीं है कि पहली कुंजी फू या बार है ) तो सरणी अच्छी तरह से हो सकती है, शायद, खाली

इसलिए यह जांचना सबसे अच्छा होगा, खासकर अगर मौका है कि लौटाया गया मूल्य बूलियन FALSE हो सकता है:

$value = empty($arr) ? $default : reset($arr);

उपरोक्त कोड का उपयोग होता है resetऔर इसके साइड इफेक्ट्स होते हैं (यह एरे के आंतरिक पॉइंटर को रीसेट करता है), इसलिए आप एरे array_sliceके पहले तत्व की कॉपी को जल्दी एक्सेस करने के लिए उपयोग करना पसंद कर सकते हैं :

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

मान लें कि आप कुंजी और मान दोनों अलग-अलग प्राप्त करना चाहते हैं , तो आपको चौथे पैरामीटर को जोड़ने की आवश्यकता है array_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);

एक जोड़ी के रूप में पहला आइटम पाने के लिए ( key => value):

$item = array_slice($arr, 0, 1, true);

अंतिम आइटम, कुंजी और मूल्य अलग-अलग प्राप्त करने के लिए सरल संशोधन :

foreach(array_slice($arr, -1, 1, true) as $key => $value);

प्रदर्शन

यदि सरणी वास्तव में बड़ी नहीं है, तो आपको वास्तव में ज़रूरत नहीं है array_sliceऔर पूरी कुंजी सरणी की प्रतिलिपि प्राप्त कर सकते हैं, फिर पहला आइटम प्राप्त करें:

$key = count($arr) ? array_keys($arr)[0] : null;

यदि आपके पास एक बहुत बड़ा सरणी है, हालांकि, कॉल करने के array_keysलिए महत्वपूर्ण समय और मेमोरी की आवश्यकता होगी array_slice(दोनों फ़ंक्शन सरणी से चलते हैं, लेकिन बाद में समाप्त हो जाता है जैसे ही यह आवश्यक वस्तुओं की संख्या एकत्र कर लेता है - जो एक है)।

एक उल्लेखनीय अपवाद तब होता है जब आपके पास पहली कुंजी होती है जो एक बहुत बड़ी और जटिल वस्तु की ओर इशारा करती है। उस मामले में array_sliceउस पहली बड़ी वस्तु का डुप्लिकेट होगा, जबकि array_keysकेवल चाबियाँ लेगा।

PHP 7.3

PHP 7.3 के array_key_first()साथ ही लागू होता है array_key_last()। साइड इफेक्ट के रूप में सरणी की आंतरिक स्थिति को रीसेट किए बिना कुशलतापूर्वक पहली और अंतिम कुंजी तक पहुंचने के लिए ये स्पष्ट रूप से प्रदान किए जाते हैं।

इसलिए PHP 7.3 में इसके पहले मूल्य को $arrayएक्सेस किया जा सकता है

$array[array_key_first($array)];

आपने अभी भी बेहतर जांच की थी कि सरणी खाली नहीं है, या आपको एक त्रुटि मिलेगी:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}

@AhmedShefeer अच्छी तरह से, अन्य उत्तर न केवल स्वीकार किए जाते हैं बल्कि आठ और वर्षों के लिए वहाँ रहे हैं । मैं यहाँ crumbs उठा रहा हूँ: -D। लेकिन विश्वास मत के लिए धन्यवाद!
एलसर्नी

1
यह मुझे इस तरह दिखता है कि यह सबसे अच्छा जवाब है, क्योंकि केवल एक अन्य गैर-पदावनत जो कि कुंजी और मूल्य दोनों देता है, वह है निरर्थक फॉरेस्ट लूप, जो अजीब है। अन्य उत्तर कुंजी के बिना केवल मूल्य देते हैं।
सूतक

1
इस ans, आधुनिक दृष्टिकोण और समय के साथ अद्यतन प्यार करता था।
संजीत बिष्ट

@ Lerni को नहीं पता कि क्या आप अभी भी सक्रिय हैं, लेकिन मैं फंस गया था और इस अच्छी तरह से समझाया गया और अपडेट की गई पोस्ट ने मुझे बचा लिया। धन्यवाद आप
izk

@ मैं हमेशा सक्रिय रहता हूँ! :-D
LSerni

44

नकली लूप जो पहले पुनरावृत्ति पर टूटता है:

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

echo "$key = $value\n";

या उपयोग each()( चेतावनी: PHP 7.2.0 के रूप में पदावनत ):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";

2
शायद इसलिए कि रीसेट () सरल है।
एमजे

1
क्योंकि समाधान आपके कोड की पहली पंक्ति में है, लेकिन आप एक और पूरी तरह से अनावश्यक लाइन लिखना जारी रख रहे हैं।
मार्कस

21
रीसेट कुंजी वापस नहीं होगा
हैरी

3
'नकली पाश' के लिए +1। मुझे प्रत्येक तत्व से गुजरते हुए पहले तत्वों की कुंजी और मूल्य प्राप्त करने की आवश्यकता है। reset()समारोह केवल पहले मान प्राप्त होता है।
फिल क्रॉस

2
साथ ही नकली लूप के लिए +1, मुझे कुंजी को रखने की आवश्यकता है ताकि रीसेट एक विकल्प नहीं था
isJustMe

25

कुछ विकल्प है। array_shift()पहला तत्व लौटाएगा, लेकिन यह पहले तत्व को सरणी से हटा देगा।

$first = array_shift($array);

current() उस सरणी का मान लौटाएगा जो उसके आंतरिक मेमोरी पॉइंटर को इंगित कर रहा है, जो डिफ़ॉल्ट रूप से पहला तत्व है।

$first = current($array);

यदि आप यह सुनिश्चित करना चाहते हैं कि यह पहले तत्व की ओर इशारा कर रहा है, तो आप हमेशा उपयोग कर सकते हैं reset()

reset($array);
$first = current($array);

3
मुझे यह उत्तर सबसे अधिक पसंद है, लेकिन ध्यान दें कि reset()वास्तव में तत्व वापस आ जाता है, इसलिए इसका अनुसरण करना एक $first = current($array)निरर्थक है।
टॉम ऑस्टर

9

बस इतना है कि हमारे पास कुछ अन्य विकल्प हैं: reset($arr);यदि आप सरणी पॉइंटर को रखने की कोशिश नहीं कर रहे हैं, तो बहुत अच्छा है, और बहुत बड़े सरणियों के साथ यह ओवरहेड की न्यूनतम मात्रा को बढ़ाता है। उस ने कहा, इसके साथ कुछ समस्याएं हैं:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

सूचक को बदले बिना ऐसा करने का तरीका:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

इसका लाभ $arr[reset(array_keys($arr))];यह है कि यह एक चेतावनी देता है यदि सरणी वास्तव में खाली है।


बहुत वर्णनात्मक उत्तर, और इसका अर्थ है दूसरों के लिए बहुत कुछ। धन्यवाद दोस्त।
जिगर7521

7

यह करने के लिए एक और आसान और सरल तरीका array_values ​​का उपयोग करें

array_values($array)[0]

reset()यह एक बेहतर विकल्प है क्योंकि यह गलत है अगर सरणी खाली है। आपका समाधान प्रश्न में उदाहरण के लिए काम नहीं करेगा
Northys

1
PHP 7+ में कुछ इस तरह काम करेगा:array_values($array)[0] ?? FALSE
MarthyM

4

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

उदाहरण के लिए:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}

3

हम कर सकते हैं $first = reset($array);

के बजाय

reset($array);
$first = current($array);

जैसा reset()

रीसेट के बाद सरणी का पहला तत्व लौटाता है;



2

इस तरह से कुंजी जानने के बिना उस सरणी से पहला आइटम प्राप्त करने के लिए रीसेट () फ़ंक्शन का उपयोग करें।

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

आउटपुट // 400


2

आप यह कोशिश कर सकते हैं।

सरणी का पहला मान प्राप्त करने के लिए: -

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

सरणी की पहली कुंजी प्राप्त करने के लिए

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>


1

मैं यह पहला और अंतिम मूल्य प्राप्त करने के लिए करता हूं। यह अधिक मूल्यों के साथ भी काम करता है।

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz

यह केवल तभी काम करता है जब आंतरिक पॉइंटर पहले तत्व पर हो। हालांकि यह अच्छा है क्योंकि यह पॉइंटर की स्थिति को रीसेट नहीं करता है, यह केवल तभी काम करता है जब पॉइंटर पहले से ही बाकी है।
ccc

1

PHP 7.3.0 से शुरू करना आंतरिक पॉइंटर को रीसेट किए बिना करना संभव है। आप उपयोग करेंगे array_key_first। यदि आप सुनिश्चित हैं कि आपके सरणी में यह मान है तो आप बस कर सकते हैं:

$first = $array[array_key_first($array)];

अधिक संभावना है, आप उस मामले को संभालना चाहेंगे जहां सरणी खाली है:

$first = (empty($array)) ? $default : $array[array_key_first($array)];

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