বেসিক এক মাত্রিক অ্যারে
$array = array(3, 5, 2, 8);
প্রযোজ্য বাছাই ফাংশন:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
এর মধ্যে পার্থক্য কেবল কী-মূল সংস্থানগুলি রাখা হয় (" a" ফাংশনগুলি), এটি নিম্ন থেকে উচ্চতর বা বিপরীত (" r") বাছাই করে, মানগুলি বা কীগুলি (" k") বাছাই করে এবং কীভাবে এটি মানের সাথে তুলনা করে (" nat" বনাম স্বাভাবিক)। একটি সংক্ষিপ্তসার এবং আরও বিশদে লিঙ্কগুলির জন্য http://php.net/manual/en/array.sorting.php দেখুন ।
বস্তুর অ্যারে সহ একাধিক মাত্রিক অ্যারে
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
আপনি যদি $arrayপ্রতিটি প্রবেশের কী 'foo' অনুসারে বাছাই করতে চান , আপনার একটি কাস্টম তুলনা ফাংশন প্রয়োজন । উপরোক্ত sortএবং সম্পর্কিত ফাংশনগুলি সাধারণ মানগুলিতে কাজ করে যেগুলি তারা কীভাবে তুলনা এবং বাছাই করতে জানেন know পিএইচপি কেবল "জানে না" নেই একটি সঙ্গে কি করতে জটিল মান মত array('foo' => 'bar', 'baz' => 42)যদিও; সুতরাং আপনি এটি বলতে হবে।
এটি করতে, আপনাকে একটি তুলনা ফাংশন তৈরি করতে হবে । এই ফাংশনটিতে দুটি উপাদান লাগে এবং 0এই উপাদানগুলিকে সমান হিসাবে বিবেচনা করা হলে অবশ্যই ফিরে আসতে হবে , 0প্রথম মানটি যদি কম হয় তবে তার চেয়ে কম মান এবং প্রথম মান বেশি 0হলে তার চেয়ে বেশি মান। এটাই দরকার:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
প্রায়শই, আপনি একটি ব্যবহার করতে চাইবেন কলব্যাক হিসাবে বেনামী ফাংশনটি । আপনি যদি কোনও পদ্ধতি বা স্ট্যাটিক পদ্ধতি ব্যবহার করতে চান তবে পিএইচপি-তে কলব্যাক নির্দিষ্ট করার অন্যান্য উপায়গুলি দেখুন ।
তারপরে আপনি এই ফাংশনগুলির একটি ব্যবহার করুন:
আবার, তারা কী-মান সংযুক্তি রাখে এবং মান বা কী অনুসারে বাছাই করে কেবল তার মধ্যেই তারতম্য। বিশদ জন্য তাদের ডকুমেন্টেশন পড়ুন।
ব্যবহারের উদাহরণ:
usort($array, 'cmp');
usortঅ্যারে থেকে দুটি আইটেম নেবে এবং তাদের সাথে আপনার cmpফাংশন কল করবে। সুতরাং হিসাবে এবং অন্য হিসাবে cmp()ডাকা হবে । এর পরে ফাংশনটি মানগুলির মধ্যে কোনটি বৃহত্তর ছিল বা সেগুলি সমান কিনা তা ফিরিয়ে দেয়। এই প্রক্রিয়া জন্য আলাদা মান ক্ষণস্থায়ী পুনরাবৃত্তি এবং যতক্ষণ না অ্যারের বাছাই হয়। ফাংশন, অনেক বার বলা হবে অন্তত সেখানে মান আছে অনেক বার হিসাবে$aarray('foo' => 'bar', 'baz' => 42)$barray('foo' => ..., 'baz' => ...)usortusort$a$bcmp$array , মান বিভিন্ন সমন্বয় সঙ্গে $aএবং $bপ্রত্যেক সময়।
এই ধারণায় অভ্যস্ত হতে, এটি চেষ্টা করুন:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
আপনি যা করেছেন তা হ'ল দুটি আইটেমের তুলনা করার জন্য একটি কাস্টম পদ্ধতির সংজ্ঞা দেওয়া হয়েছিল, এটিই আপনার প্রয়োজন। যা সকল ধরণের মান নিয়ে কাজ করে।
যাইহোক, এটি কোনও মান নিয়ে কাজ করে, মানগুলি জটিল অ্যারে হতে হবে না। আপনার যদি করতে একটি কাস্টম তুলনা থাকে তবে আপনি এটি সাধারণ সংখ্যার অ্যারেতেও করতে পারেন।
sort রেফারেন্স অনুসারে বাছাই করে কার্যকর কিছু দেয় না!
নোট করুন যে অ্যারে স্থানে সাজানো হয়েছে , আপনাকে কোনও কিছুর জন্য রিটার্ন মান নির্ধারণ করার দরকার নেই। সাজানো অ্যারে দিয়ে নয়, $array = sort($array)অ্যারের সাথে প্রতিস্থাপন করবে true। মাত্রsort($array); কাজ করে।
কাস্টম সংখ্যার তুলনা
যদি আপনি bazকীটি অনুসারে বাছাই করতে চান যা সংখ্যাসূচক, আপনার যা করা দরকার তা হ'ল:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
মাউথের মাউথার কাছে ধন্যবাদ এটি <0, 0 বা> 0 এর $aচেয়ে কম, সমান বা তার চেয়ে বড় কিনা তার উপর নির্ভর করে একটি মান দেয়$b ।
নোট করুন যে এটি floatমানগুলির জন্য ভাল কাজ করবে না , যেহেতু সেগুলি হ্রাস পাবে intএবং নির্ভুলতা হারাবে। স্পষ্ট ব্যবহার করুন -1, 0এবং 1পরিবর্তে মান ফিরে।
অবজেক্টস
আপনার যদি অবজেক্টগুলির একটি অ্যারে থাকে তবে এটি একইভাবে কাজ করে:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
ক্রিয়াকলাপ
কলিং ফাংশন সহ আপনি তুলনা ফাংশনের অভ্যন্তরে আপনার যা কিছু প্রয়োজন তা করতে পারেন:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
স্ট্রিংস
প্রথম স্ট্রিং তুলনা সংস্করণের জন্য একটি শর্টকাট:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmpcmpএখানে প্রত্যাশা করা ঠিক কি করে , এটি ফিরে আসে -1, 0বা 1।
স্পেসশিপ অপারেটর
পিএইচপি 7 স্পেসশিপ অপারেটর প্রবর্তন করে , যা বিভিন্ন ধরণের তুলনার তুলনায় সমান / ছোট / বৃহতকে এক করে এবং সরল করে:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
একাধিক ক্ষেত্র অনুসারে বাছাই করা হচ্ছে
আপনি যদি প্রাথমিকভাবে বাছাই করতে চান fooতবে fooদুটি উপাদানের জন্য যদি সমান হয় তবে সাজান baz:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
পরিচিতদের জন্য এটি একটি এসকিউএল কোয়েরির সমতুল্য ORDER BY foo, baz।
এছাড়াও এটি খুব ঝরঝরে শর্টহ্যান্ড সংস্করণ এবং কীভাবে স্বেচ্ছাসেবী সংখ্যার কীগুলির জন্য গতিময়ভাবে এইরকম তুলনা ফাংশন তৈরি করবেন তা দেখুন ।
একটি ম্যানুয়াল, স্থিতিশীল ক্রম অনুসারে বাছাই করা হচ্ছে
আপনি যদি "foo", "বার", "বাজ" এর মতো উপাদানগুলিকে "ম্যানুয়াল অর্ডার" এ সাজান চান :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
উপরের সমস্তটির জন্য, আপনি যদি পিএইচপি 5.3 বা ততোধিক উচ্চতর ব্যবহার করছেন (এবং আপনার সত্যই হওয়া উচিত), সংক্ষিপ্ত কোডের জন্য বেনামে ফাংশন ব্যবহার করুন এবং অন্য কোনও বৈশ্বিক ফাংশনটি ভাসমান এড়াতে:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
জটিল বহুমাত্রিক অ্যারে বাছাই করা কতটা সহজ। আবার, পিএইচপি শেখানোর ক্ষেত্রে কেবল চিন্তা করুন যে দুটি আইটেমের মধ্যে কোনটি "বৃহত্তর" তা কীভাবে বলা যায় ; পিএইচপি আসল বাছাই করতে দিন।
উপরের সমস্তটির জন্য, আরোহণ এবং উতরাইয়ের ক্রমগুলির মধ্যে স্যুইচ করার জন্য কেবল চারপাশে $aএবং $bআর্গুমেন্টকে অদলবদল করুন । উদাহরণ:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
অন্যের উপর ভিত্তি করে একটি অ্যারে বাছাই করা
এবং তারপরে অদ্ভুততা রয়েছে array_multisortযা আপনাকে অন্যের উপর ভিত্তি করে একটি অ্যারে বাছাই করতে দেয়:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
এখানে প্রত্যাশিত ফলাফল হবে:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
array_multisortসেখানে যেতে ব্যবহার করুন :
array_multisort($array1, $array2);
পিএইচপি 5.5.0 হিসাবে আপনি array_columnএকটি বহুমাত্রিক অ্যারে থেকে একটি কলামটি বের করতে এবং সেই কলামটিতে অ্যারে বাছাই করতে ব্যবহার করতে পারেন :
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
পিএইচপি 7.0.0 হিসাবে আপনি অবজেক্টগুলির একটি অ্যারে থেকে বৈশিষ্ট্যও বের করতে পারেন।
আপনার যদি আরও সাধারণ কেস থাকে তবে এই উত্তরটি সম্পাদনা করতে দ্বিধা বোধ করুন।