কোনও (সম্ভবত) সাহসী অ্যারেতে প্রথম কী পান?


756

সম্ভাব্য সংঘবদ্ধ অ্যারেতে প্রথম কীটি নির্ধারণের সেরা উপায় কী? আমার প্রথম এটি কেবল অ্যারের ভবিষ্যদ্বাণী করা এবং তারপরে তাৎক্ষণিকভাবে এটি ভঙ্গ করা ভেবেছিল:

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

সুতরাং having কী থাকাতে প্রথম কী থাকে তবে এটি অকার্যকর বলে মনে হয়। কারও কি এর চেয়ে ভাল সমাধান আছে?


4
অদক্ষ ফোরচ কেন?
এমিলিও গোর্ট

2
সমস্ত উত্তরের তুলনায়, ফোরচ এখনও দ্রুততম ফিডল, পিএইচপি 5.3 , পিএইচপি 5.5-এ আমার লোকালহোস্ট পরীক্ষাটি দেখায় যে পার্থক্যটি সামান্য সামান্যই ফোরচের পক্ষে।
দানিজেল

3
@ ডানিজেল, foreachশব্দার্থগতভাবে ভুল।
পেসারিয়ার

2
@AlexS, নয়তো each($arr)['key']বা each($arr)[0]কাজ করবে।
পেসারিয়ার

1
@ ডানিজেল আর নেই ... কী 0.01070.0217
:, ভবিষ্যদ্বাণী

উত্তর:


1337

2019 আপডেট

পিএইচপি .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(), কোনও অ্যারের প্রথম উপাদান (মান, কী নয়) ফেরত দিতেও ঘটবে যা কার্যকরও হতে পারে।
ডিভাইস 1

5
কোনও সাহসী অ্যারের প্রথম মান পেতে রিসেট () reset()saying বলার জন্য ডক্সে একটি মন্তব্য আছে Don't use । এটি সত্য অ্যারেগুলির জন্য দুর্দান্ত কাজ করে তবে আইট্রেটার অবজেক্টগুলিতে অপ্রত্যাশিতভাবে কাজ করে। bugs.php.net/bug.php?id=38478 that এটি কি এখনও সত্য? আমি বিভ্রান্ত
দিমিত্রি পশকভিচ

13
@ দিমিত্রিপাস্কেভিচ: এই মন্তব্যটি নিয়ে চিন্তা করবেন না। তারা arrayঅবজেক্টের বিষয়ে কথা বলছে না , তবে কাস্টম অবজেক্টগুলি (যা প্রকৃত অ্যারে নয়)। আমি অনুমান করি যে তারা বিভ্রান্ত ডাটা স্ট্রাকচারের মধ্যে পার্থক্য পেয়েছে, তবে মূলত, resetপ্রথম "কী" এর মান দেয় যা বস্তুর জন্য $prop"বাগ" প্রতিবেদনে প্রদত্ত উদাহরণ হিসাবে প্রদর্শিত হবে , তবে অ্যারের জন্য প্রথম কীটি হবে। সুতরাং চিন্তা করবেন না, যতক্ষণ না আপনি আসল অ্যারে ব্যবহার করেন (এর সাথে তৈরি করেছেন array(…)), আপনার কোনও সমস্যা হবে না।
Blixt

2
এটি উল্লেখ করা উচিত যে শেষ () এবং রিসেট () এর পার্শ্ব প্রতিক্রিয়া রয়েছে। তবে, বিশ্বের বেশিরভাগ কোড অভ্যন্তরীণ পয়েন্টার কোথাও থাকার উপর নির্ভর করে না, তাই এটি সাধারণত কোনও সমস্যা নয়।
ডানকুইক্সোট

1
@ user3019105 একটাই অ্যারের প্রতি অভ্যন্তরীণ পয়েন্টার, যার মানে যদি আপনার ফাংশন বাইরে কোনো কোড এটা পরিবর্তন (কল করে হয় next, reset, endবা অ্যারে মাধ্যমে looping), আপনি প্রত্যাশিত মান পাবেন না আপনি কল যখন key। তাই হ্যাঁ, আপনি যা চান তা নিশ্চিত resetহওয়ার জন্য ব্যবহার keyকরার আগে সর্বদা কল করুন ।
Blixt

80

array_keysকীগুলির একটি অ্যারের প্রদান করে। প্রথম প্রবেশ করুন। বিকল্পভাবে, আপনি resetঅ্যারেতে এবং তারপরে কল করতে পারেন key। পরবর্তী পদ্ধতিটি সম্ভবত সামান্য দ্রুত (থাগ আমি এটি পরীক্ষা করিনি) তবে অভ্যন্তরীণ পয়েন্টারটি পুনরায় সেট করার পার্শ্ব প্রতিক্রিয়া রয়েছে।


52
এর ভবিষ্যতের পাঠকদের জন্য কেবলমাত্র একটি (দেরী) নোট: পরবর্তী পদ্ধতিটি কেবল "সামান্য" দ্রুত নয়। একটি সম্পূর্ণ অ্যারের পুনরুক্তি করা, অন্য নতুন তৈরি হওয়া অ্যারেতে প্রতিটি কী সংরক্ষণ করে এবং একটি অ্যারের প্রথম কীটিকে স্ট্রিং হিসাবে অনুরোধ করার মধ্যে একটি বড় পার্থক্য রয়েছে।
Blixt

3
প্রশ্নটিতে অপের যেমন প্রশ্নাগুলি রয়েছে তেমন অক্ষম পূর্বসূত্র কেন এই সমস্ত উত্তরের সাথে তুলনা করে?
এমিলিও গোর্ট

5
এমিলিওগার্ট আমি মনে করি না আসলে foreach+ breakএবং reset+ এর পারফরম্যান্সে কোনও পার্থক্য রয়েছে key। তবে প্রাক্তনটি বরং অদ্ভুত দেখাচ্ছে, তাই স্টাইলিস্টিক ইস্যুগুলির জন্য, আমি দ্বিতীয়টি পছন্দ করব।
আফ্রোস্কেন

@ এমিলিওগার্ট: আফাইক, ফোরচ () অভ্যন্তরীণভাবে অ্যারের অনুলিপি করে। সুতরাং আমরা এটি ধীর বলে ধরে নিতে পারি। (কেউ যদি এটি নিশ্চিত করতে পারে তবে দুর্দান্ত হবে)
ডানকুইক্সোট

3
@ ডনকুইক্সোট আমি নিশ্চিতভাবে জানি না, তবে ধরে নিচ্ছি এটি একটি নিয়মিত অ্যারে (এবং কোনও ধরণের বা আইট্রেটার ইন্টারফেস প্রয়োগকারী কোনও উপাদান নয়), আমি অবশ্যই নিশ্চিত foreachযে এর জন্য কোনও অভ্যন্তরীণ অনুলিপি তৈরি করে না, বরং কেবল একটি পয়েন্টারকে পুনরাবৃত্তি করে , আরও নিম্ন-স্তরের ইত্যাদি ব্যবহারের অনুরূপ next,current
ট্রয়স্কলন

54

আকর্ষণীয়ভাবে যথেষ্ট, ফোরচ লুপটি আসলে এটি করার সবচেয়ে কার্যকরী উপায়।

যেহেতু ওপি বিশেষত দক্ষতার বিষয়ে জিজ্ঞাসা করেছিল, তাই এটি উল্লেখ করা উচিত যে সমস্ত বর্তমান উত্তরগুলি প্রকৃতপক্ষে কোনও ভবিষ্যতের তুলনায় অনেক কম দক্ষ।

আমি পিএইচপি 5.4 এর সাথে এটিতে একটি বেঞ্চমার্ক করেছি এবং রিসেট / কী পয়েন্টার পদ্ধতি (স্বীকৃত উত্তর) একটি ভবিষ্যদ্বাণী থেকে প্রায় 7 গুণ ধীর বলে মনে হচ্ছে। অন্যান্য সমগ্র অ্যারের সাধিত পন্থা (array_keys, array_flip) স্পষ্টত এমনকি ধীর যে এর চেয়ে এবং পরিণত অনেক যখন বৃহৎ অ্যারের সাথে কাজ খারাপ।

ফরচ মোটেও অদক্ষ নয়, এটি নিখরচায় ব্যবহার করুন!

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

আমার পিএইচপি 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

রিসেট + Key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs


3
আপনার কোথাও মানদণ্ড রয়েছে? যেমন আপনি কীভাবে ইত্যাদি পরীক্ষা করেছেন, তাদের চালানোর জন্য আপনাকে ধন্যবাদ!
ফ্লু

আমি সত্যটি উল্লেখ করতে চাই, পুরো পরীক্ষার মধ্যে একই অ্যারে ব্যবহার করা হয়। আমি মনে করি যে এই ঘটনাটি পূর্বাভাসের পদ্ধতিকে উল্লেখযোগ্যভাবে প্রভাবিত করে। @ ডনকুইকসোট যেমন উপরে কিছু প্রতিক্রিয়াতে মন্তব্যে উল্লিখিত হয়েছে - পূর্বাভাস অভ্যন্তরীণভাবে অ্যারের অনুলিপি করে। আমি কল্পনা করতে পারি যে অ্যারে অনুলিপি করা এড়ানো কেবল এই পরীক্ষার মধ্যেই কর্মক্ষমতা বাড়ায় তাই এই অনুলিপিটি পুনরায় ব্যবহার করা হয়েছে mark
জর্দা

2
@ জর্দা পিএইচপি 7 এর হিসাবে অ্যারেটি foreachঅনুলিপি না করুন যদি না আপনি সরাসরি ফরচ লুপের ভিতরে পরিবর্তন করেন mod পিএইচপি 5 এ অ্যারের কাঠামোটি কিছু ক্ষেত্রে অনুলিপি করা যেতে পারে (যখন এর পুনঃসংশোধন> 1) এবং আপনি প্রকৃতপক্ষে ঠিক এটি এটি একটি উল্লেখযোগ্য প্রভাব হতে পারে। ভাগ্যক্রমে এটি php7 এ নিয়ে উদ্বিগ্ন হওয়ার কিছু নেই, যেখানে এই সমস্যাটি সমাধান হয়েছিল। ফোরচ এখন হুডের অধীনে কীভাবে কাজ করে এবং অতীতে কীভাবে কাজ করেছিল তা উভয়েরই এখানে দুর্দান্ত পড়ুন।
ওয়েবমুট

2
উপরের বেঞ্চমার্কটি ব্যবহার করে পিএইচপি 7.2 অনুসারে, ভবিষ্যদ্বাণী এখনও দ্রুততম
বিলেণোহ

36

key($an_array) আপনাকে প্রথম চাবি দেবে

প্রতি Blixt সম্পাদনা করুন: অ্যারের শুরুতে পয়েন্টারটি পুনরায় সেট করতে আপনার reset($array);আগে কল করা উচিত key($an_array)


7
মনে রাখবেন অ্যারের পয়েন্টারটি প্রথম উপাদানটিতে নাও থাকতে পারে, আমার উত্তরটি দেখুন।
Blixt

আমি মনে করি এই উত্তরটি আমার মামলাটিকে পুনরায় সেট না করে সহায়তা করবে কারণ আমি প্রথমে নিশ্চিত করছি অ্যারেতে কেবল একটি উপাদান রয়েছে। ধন্যবাদ
গ্রোভেনেক্টর


22

2018+ এর জন্য

পিএইচপি 7.3 দিয়ে শুরু করে একটি array_key_first()ফাংশন রয়েছে যা একে একে অর্জন করে:

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

নথিপত্র পাওয়া যায় এখানে । 😉


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

2
এটি সম্ভবত সবচেয়ে দক্ষ নয়।
ইয়াদ

3
@ ইয়াদা, হ্যাঁ, তবে বিরল ক্ষেত্রে এটি লক্ষণীয় হতে পারে; বেশিরভাগ ক্ষেত্রে পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের গুরুত্ব অনেক বেশি; এবং আমি এমন সমাধানও পছন্দ করি যা মূল বস্তু / অ্যারেগুলিকে পরিবর্তন করে না: যেমন: পুনরায় সেট করুন ($ আর); $ কী = কী ($ আর); - সর্বদা ভাল ধারণা নয়, আমি মার্টিক্স এর সমাধানটি বেছে নিয়েছি যা আমার থেকে আরও সংক্ষিপ্ত, উদাহরণস্বরূপ: অ্যারে_কিজ ($ আরএ) [0];
সের্গেই সোকোলেঙ্কো

20

দক্ষতা যদি আপনার পক্ষে ততটা গুরুত্বপূর্ণ না হয় তবে array_keys($yourArray)[0]আপনি পিএইচপি 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
এটি পিএইচপি 5.4 এ রয়েছে। এটি বলা হয় array dereferencing। উদাহরণস্বরূপ দেখুন: schlueters.de/blog/archives/…
মার্টিন ভেটটিকা

@ ট্রান্ট, পিএইচপি <5.4 বাদে এটি সূর্যের নীচে প্রতিটি ভাষায় বৈধ।
পেসারিয়ার


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

1
@ জারজিমিস্টার max()ডোজ কোনও এসোসিয়ে অ্যারের প্রথম কীটি ফিরিয়ে দেয় না। একটি তালিকা বা একটি অ্যারের আইটেমের সর্বাধিক মান ফেরৎ
হামিদ্রেজা

5
ওপি অনুরোধ নয়, তবে কিছু পরিস্থিতিতে খুব দরকারী।
d.raev

9

এটি একটি সমাধান হতে পারে:

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

আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে।

ওয়ার্কিং কোড


3
অ্যারে_ফ্লিপ (): কেবলমাত্র STRING এবং INTEGER মানগুলি ফ্লিপ করতে পারে!
মাউরো

5

ওয়েবমুটের সমাধানটি বাড়ানোর জন্য , আমি নিম্নলিখিত সমাধানগুলি যুক্ত করেছি:

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

পিএইচপি 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 

অ্যারে_কিগুলি পদ্ধতিটি 30 সেকেন্ডে শেষ হয় (কেবল 1000 উপাদানগুলির সাথে, বিশ্রামের সময় একই ছিল তবে অ্যারে_কিগুলি পদ্ধতিতে প্রায় 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এটি থেকে প্রথম উপাদানটির মান কেটে দেয়। এর জন্য আপনার পিএইচপি 5.4+ প্রয়োজন হবে।



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

আজ আমাকে পোস্টের অনুরোধে ফিরে আসা আমার অ্যারের প্রথম কীটি সন্ধান করতে হয়েছিল। (এবং একটি ফর্ম আইডি ইত্যাদির জন্য নোটটি নোট করুন)

ভাল, আমি এটি খুঁজে পেয়েছি: পিএইচপি-তে এসোসিয়েটিভ অ্যারের প্রথম কীটি ফিরিয়ে দিন

http://php.net/key

আমি এটি করেছি, এবং এটি কাজ করে।

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

হতে পারে এটি অন্য কোনও লোকের 15 মিনিট পরিবেশিত হবে। 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
এগুলি মানগুলি নয়, কীগুলি নয়।
ভিক্টর শ্রড্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.