অ্যারেতে শেষ কী কীভাবে পাবেন?


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
@ পিম: ওপি সেই অ্যারের সাথে কী করতে চায় তার উপর নির্ভর করে (কল করার প্রয়োজন হতে পারে না reset()) ;; তবে আপনি সঠিকভাবে সেই ফাংশনটি নির্দেশ করতে পারেন যা কার্যকর হতে পারে।
পাস্কাল মার্টিন

3
@ পাসকালমার্টিন +1 আমি মনে করি আপনার উত্তরে পুনরায় সেট করার বিষয়ে একটি মন্তব্য যুক্ত করা খুব সহায়ক হবে helpful
লুলু

অ্যারেটির সদৃশ মান থাকলে এই পদ্ধতির কাজ হয় না। যেমন। জন্য array('a', 'b', 'c', 'd', 'a')এটা কী 0 বরং 4. চেয়ে ফিরে আসবে
মার্ক

2
@ মার্ক এই পদ্ধতির ডুপ্লিকেট মান আছে এমনকি সঠিকভাবে কাজ করে।
জেফ

1
@ পিপিপি এটি কাজ করে না কারণ ... শেষ () কী ফিরে আসে তা পরীক্ষা করে দেখুন এবং তারপরে আবার চিন্তা করুন;)
ফোরসবার্গ

79

যদিও end()এটি সবচেয়ে সহজ বলে মনে হচ্ছে এটি দ্রুততম নয়। দ্রুত এবং অনেক শক্তিশালী বিকল্প হ'ল array_slice():

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

পরীক্ষাগুলি হিসাবে , 500000 উপাদান সহ একটি অ্যারেতে, এটি প্রায় 7x দ্রুত!


98
এই উত্তরে উত্তেজিত হয়ে আমি ১০০,০০০ পুনরাবৃত্তির একটি দ্রুত পরীক্ষা end($arr);$key = key($arr);reset($arr);করেছিলাম (ক) এর সাথে (খ) তুলনা করেছি $key = key(array_slice($arr,-1,1,true));... যার ফলে খুব end()বেশি দ্রুত হওয়া যায়! শেষ () = 0.05326 সেকেন্ড, অ্যারে_স্লাইস = 8.506 সেকেন্ড ... হু ??
নিউওসিও

54
পিএইচপি-র অন্তর্নির্মিত ফাংশনগুলি চরম নার্ড দ্বারা নির্মিত হয়েছিল। এই ফাংশনগুলি পুনরায় তৈরি করার চেষ্টা করবেন না। মতবিরোধগুলি হ'ল আপনি আসলটির চেয়ে কিছুটা ধীরে ধীরে কিছু তৈরি করেন। আপনি যদি কোনও ধরণের দুষ্ট উইজার্ড না হন তবে কউস of
ডিএমএমডি

16
end()এটি দ্রুততম কারণ এটি খুব সাধারণ সি-ফাংশন থেকে নেওয়া যেতে পারে যেমন:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
গুস্তাভ

10
@ গুস্তাভ আমি বিশ্বাস করি পিএইচপি-র অন্তর্নিহিত সি-বাস্তবায়ন, আসলে lastশেষ উপাদানটির অভ্যন্তরীণ পয়েন্টার রয়েছে । মেকিং end()প্রায় কাছাকাছি হে (1)। :-)
এরিক

15
@ ডিএমএমডি, আমি নিশ্চিত পিএইচপি টিম চূড়ান্তভাবে সন্তুষ্ট হবে যেগুলি তাদের নার্ড বলা হয়।
datasn.io

53

আমি পছন্দ করি

end(array_keys($myarr))

19
কঠোর বিজ্ঞপ্তির কারণ, শেষটি একটি পরিবর্তনশীল রেফারেন্সের প্রত্যাশা করে
উইলিয়াম

25
আপনি end((array_keys($myarr)))বিজ্ঞপ্তি পেতে ব্যবহার করতে পারেন ।
বেন ফরচুন

9
@ বেনফর্টুন এটি পিএইচপি 7 এ স্থির করা হয়েছে: "পিএইচপি 5-তে, ফাংশন প্যারামিটারটি রেফারেন্স দ্বারা পাস করার পরে কোনও ফাংশন প্যারামিটারের আশেপাশে অপ্রয়োজনীয় বন্ধনী ব্যবহার করা কঠোর মানদণ্ডের সতর্কতাগুলিকে শান্ত করতে পারে The সতর্কতা এখন সর্বদা জারি করা হবে" "
ডমিনিক শাইরিলিংক

এটি সম্পূর্ণ অপ্রয়োজনীয় সতর্কতা! এটি অন্য সমস্ত ভাষায় এ জাতীয় এবং সাধারণ জিনিস!
আজেরাফতি

1
অন্যান্য ভাষায়, ফাংশনগুলি পয়েন্টারগুলিতে কাজ করে না, তাই না?
jurchiks

52

পিএইচপি 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! আমি এই উত্তরটি যুক্ত করতে চলেছিলাম। আপনি "পিএইচপি 7.3" সংস্করণ এবং 2018 বছর হাইলাইট করতে পারেন? অন্যদের জন্য এই দুর্দান্ত সংবাদটি পাওয়া সহজ হবে
টম ভোটারুবা

এটি উল্লেখ করা ভাল যে এটি অভ্যন্তরীণ অ্যারে পয়েন্টারকে প্রভাবিত করে না।
মুভেরিসেক

30

শুধু ব্যবহার করুন: echo $array[count($array) - 1];


75
এটি কেবলমাত্র যদি আপনার সংখ্যাসূচক অ্যারে থাকে তবে কাজ করে। সহযোগী অ্যারেতে ব্যর্থ।
জেরেমি জে স্টারচার

12
এটি কেবল সংখ্যাসূচক অ্যারেগুলিতেই কাজ করে না, এটি কীটি প্রদর্শন করতে ব্যর্থ হয়েছে তবে মানটি দেখায়, তাই না?
Nanne

আমাকে খুব জ্যাক, আমরা এমন কিছু করতে পারি যেখানে আমরা এটি বিভক্ত করি (সৎ হতে পারি) শীর্ষ গুগল হিট এবং অ্যাসোসিয়েটিভ উভয় ক্ষেত্রেই হিট হয় যাতে আমাদের উভয়ের জন্য পুরাতন রেফারেন্স থাকে ... আমি কেবল এটি তৈরি করেছিলাম পার্স করার পরে এটি ছিল এসোসিয়েটের জন্য int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }যা আকর্ষণীয় তবে ব্যবসায়ের পক্ষে ভাল নয় যখন আপনি একটি সময় বাজেটে থাকেন
লোল

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
এই উত্তরটি (প্রযুক্তিগতভাবে সঠিক হলেও) অপব্যয় / অদক্ষ কারণ এটির জন্য একটি অতিরিক্ত অ্যারে (মূল হিসাবে সমান দৈর্ঘ্যের) তৈরি করা প্রয়োজন। এর অর্থ হ'ল মূল অ্যারে যেমন করে বর্জ্য বৃদ্ধি পায়। এটি কখনই পাস্কাল মার্টিনের দক্ষ উত্তরের উপরে নির্বাচন করা উচিত নয়। আমি বিস্মিত এই অনেক upvotes আছে।
মিকম্যাকুসা

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 এর পরে গড় হয় প্রাথমিক বেঞ্চমার্কের জন্য @ এমএইচিটগারাকে ক্রেডিট @ তাদেজমগজ্ঞার উত্তরে মন্তব্য করেছে ।

এর অর্থ আপনি চূড়ান্ত কীটির মান ছাড়াই পুনরুদ্ধার করতে পারেন:

  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()অ্যারে_কি_ফার্স্ট () এর সহোদর কাজ
  • এই দুটি কার্যই "পয়েন্টার-অজ্ঞ" "
  • উভয় ফাংশন ফিরে 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
বাহ, আমার এই উত্তরের একটি ডিভি? বিষয়টি কী ছিল, খুব ব্যাপক / চূড়ান্ত / ব্যাখ্যামূলক / সমর্থিত? Pfft। নিশ্চিতভাবে পোস্টগুলিকে ধাক্কা দিয়ে চালিয়ে যান যা জানাতে সাহস করে। ভাল করেছ. আপনি যদি না জানেন তবে ডিভি বোতাম এমন পোস্টগুলির জন্য যা "দরকারী নয়"। আপনার লক্ষ্য এখানে কি দয়া করে নিজেকে জিজ্ঞাসা করুন।
মিকম্যাকুসা

8

নিম্নলিখিত হিসাবে অ্যারে_পপ এবং অ্যারে_কিগুলি ফাংশনটি ব্যবহার করার চেষ্টা করুন :

<?php

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

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

?>

14
আপনার অ্যারেতে এটিতে 1 টিরও বেশি জিনিস থাকলে এটি সত্যিই ধীর। দয়া করে এটি করবেন না।
অ্যান্ড্রে

3
এবং কঠোর বিজ্ঞপ্তিরও কারণ, পরিবর্তনশীল উল্লেখ
উইলিয়াম

অ্যারে_পপ () মূল অ্যারেটি সংক্ষিপ্ত করবে (শেষ উপাদানটি সরিয়ে ফেলবে)। আমি নিশ্চিত নই যে এটি অপের পক্ষে বিবেচিত হবে বা না তবে অন্যের পক্ষে অবশ্যই তা বিবেচিত হবে।
প্রোগ্রামার

1
আসলে তা না. এই উদাহরণে মূল অ্যারে নয় এবং array_pop()এর রিটার্ন মান নিয়ে কাজ করে । array_keys()
পেটকো বোসাকভ

যেহেতু আরও আরও কার্যকর উত্তর রয়েছে যা কোনও বিজ্ঞপ্তি দেয় না, তাই আমি এই উত্তরটিকে নিম্নমানের করছি।
মিকম্যাকুসা

6

পিএইচপি হিসাবে> = .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 করে নেওয়া হবে (অ্যারে কীগুলি 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 => 'বিড়াল') নয়; $ শেষকী একটি ভুল মান ফিরিয়ে দেবে
কাকোমা

@ কাকোমা - ​​যেমন আমার পোস্টটি বলেছে "ধরে নিচ্ছি আপনার সমস্ত কীগুলি কোনও ফাঁক ছাড়াই সংখ্যাযুক্ত"।

যে কেউ বিস্মিত হন তার জন্য পিএইচপি এর "অ্যারে_ভ্যালু" ব্যবহার করে অ্যারেটিকে অঙ্কের অনুক্রমিক করে রাখুন। 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
কেবলমাত্র একটি মান টানতে পুরো অ্যারেটিকে বিপরীত করা অবশ্যই প্যাসকালমার্টিনের পদ্ধতির চেয়ে কম দক্ষ। এটি প্রযুক্তিগতভাবে সঠিক হলেও এটি কখনই পাস্কেলের পদ্ধতির জায়গায় ব্যবহার করা উচিত নয়।
মিকম্যাকুসা

3

আমি স্রেফ জেন্ডারের কাছ থেকে সাহায্যকারী-ফাংশন নিয়েছি এবং এর আগে উত্তরগুলির সাথে এটি উন্নত করেছি:

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'

এটি কাজ করে কারণ পিএইচপি এটির অ্যারি পয়েন্টারটি অভ্যন্তরীণভাবে $ অ্যারের জন্য সরায়


2
এটি পাস্কালমার্টিনের পদ্ধতির একটি সদৃশ। দয়া করে এই পৃষ্ঠাটি ছাড়ুন এবং আপনার দেরী / সদৃশ উত্তর মুছুন। Downvoted।
মিকম্যাকুসা

0

সর্বোত্তম সম্ভাব্য সমাধান যা ইনলাইনও ব্যবহার করা যেতে পারে:

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

এই সমাধানটি কেবল প্রকাশ / বিবৃতি এবং ভাল সরবরাহ করে সেরা সম্ভাব্য পারফরম্যান্স নয়।

অন্তর্নিহিত উদাহরণ ব্যবহার:

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


আপডেট: পিএইচপি 7.3+ এ: সদ্য যুক্ত হওয়া array_key_last()পদ্ধতিটি ব্যবহার করুন (অবশ্যই) ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.