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




प्रेम रावत ज्ञान कुंजी हिंदी (16)

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

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

मैंने php 5.4 के साथ इस पर एक बेंचमार्क किया था, और रीसेट / कुंजी सूचक विधि (स्वीकृत उत्तर) एक foreach से लगभग 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

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

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

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


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

array_shift(array_keys($array))

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


तुम कोशिश कर सकते हो

array_keys($data)[0]

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

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

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

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


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

खैर, मुझे यह मिल गया है: PHP में सहयोगी सरणी की पहली कुंजी लौटें

key

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

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

शायद यह एक अन्य लड़के के 15min ईको होगा। CYA।


एक लाइनर:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'

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

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

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

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

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

$first_value = reset($array);

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

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

रिक्त पुनरावर्तनीय / सरणी के लिए फ़ॉलबैक के साथ एक और सार्वभौमिक और सुरक्षित संस्करण:

नोट: $ सरणी iterable एक array या iterable (PHP> = 7.1)

$array = [/* ... */]; // my array or iterable

// these lines are a fallback for the case nothing is found
$firstKey = null; // null or default value of your choice
$firstValue = null; // null or default value of your choice

// iterating the array
foreach ($array as $firstKey => $firstValue) {
    // stop after first iteration
    break;
}

टीएलडीआर: इस तरह आपको इसे पुन: जांचने की आवश्यकता नहीं है। (इस मामले में सरणी)।

Foreach सब कुछ खत्म करने का सबसे तेज़ तरीका है।

सिफारिशें और स्पष्टीकरण: मैं $firstKey और $firstValue लिए डिफ़ॉल्ट मानों को सेट करने की अनुशंसा करता हूं, फिर भी आप जानते हैं कि सरणी खाली थी या नहीं।

नोट: यदि आप भरोसा करते हैं कि आपकी सरणी हमेशा पॉप्युलेट हो जाएगी तो डिफ़ॉल्ट मानों की कोई आवश्यकता नहीं है। (लेकिन इसके बारे में 100% सुनिश्चित हो!)

अधिक उन्नत सामग्री के लिए स्पष्टीकरण:

यदि आपके पुनरावर्तनीय के पास कस्टम Iterator तो आपको फ़ोरैच स्टेटमेंट के बाद इसे मैन्युअल रूप से रीसेट करने की आवश्यकता हो सकती है।

PHP के बारे में अधिक : iterables


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

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

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

$first_key = current(array_flip($array));

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


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


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

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

उदाहरण:

# 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


आप इसे आजमा सकते हैं। सरणी का पहला मान प्राप्त करने के लिए: -

<?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));
?>




arrays