PHP Array Sorting Functions
PHP Array Sorting Functions Part-1: PHP array sort, rsort, and usort function
PHP সহ যেকোনো Language এই Sorting একটি গুরুত্বপূর্ণ বিষয়, আজকের পর্বে আমরা PHP Language এর Built-in Sorting Function গুলোর মধ্যে sort, rsort, and usort এই Function গুলো নিয়ে আলোচনা করব।
PHP sort() Function
PHP তে array এর value গুলোকে ascending order এ সাজানোর জন্য sort() function টি ব্যবহৃত হয়।
আরো বিস্তারিত এইভাবে বলা যায় , PHP-তে, sort() ফাংশনটি element গুলির value গুলির উপর ভিত্তি করে একটি অ্যারেকে ascending order এ সাজাতে ব্যবহৃত হয়। ফাংশনটি অ্যারের মধ্যে এলিমেন্ট গুলিকে পুনর্বিন্যাস করে যাতে সর্বনিম্ন বা সবচেয়ে ছোট value গুলি প্রথমে আসে এবং সর্বোচ্চ বা সবচেয়ে বড় value গুলি শেষে আসে৷
Note: এই ফাংশনটি অ্যারের উপাদানগুলিতে নতুন key বরাদ্দ করে। এটি বিদ্যমান key গুলিকে reordering অর্থাৎ পুনরায় সাজানোর পরিবর্তে কীগুলিকে রিমুভ করে নতুন numeric key দেবে।
PHP sort() function syntax()
sort(array &$array, int $flags = SORT_REGULAR): true
Parameters:
- $array: এখানে input array টি থাকবে।
- flags: optional second parameter টি flags এই মানগুলি ব্যবহার করে সাজানোর আচরণ পরিবর্তন করতে ব্যবহার করা যেতে পারে:
Sorting type flags:
- SORT_REGULAR – সাধারণভাবে আইটেম তুলনা করে ;
- SORT_NUMERIC – আইটেমগুলিকে numerically তুলনা করে ৷
- SORT_STRING – আইটেমগুলিকে string হিসেবে তুলনা করে।
- SORT_LOCALE_STRING – setlocale() current locale এর উপর ভিত্তি করে আইটেমগুলিকে স্ট্রিং হিসাবে তুলনা করে । এটি setlocale()ব্যবহার করে পরিবর্তন করা যেতে পারে
- SORT_NATURAL – natsort() এর মত “natural ordering” ব্যবহার করে আইটেমগুলিকে স্ট্রিং হিসাবে তুলনা করে।
- SORT_FLAG_CASE – case-insensitively স্ট্রিংগুলি সাজানোর জন্য SORT_STRING বা SORT_NATURAL এর সাথে (বিটওয়াইজ বা) একত্রিত করা যেতে পারে
PHP sort ফাংশন কিভাবে কাজ করে?
PHP-তে sort() ফাংশনের মতো একটি sorting ফাংশন কীভাবে “bubble sort” নামক একটি সাধারণ sorting অ্যালগরিদম ব্যবহার করে কাজ করে তার একটি simplified pseudocode উপস্থাপনা এখানে দেওয়া হল।
function bubbleSort(array) n = length(array) do swapped = false for i from 0 to n-2 if array[i] > array[i+1] swap(array[i], array[i+1]) swapped = true end for n = n - 1 while swapped end function
এই সিউডোকোডে, আমাদের কাছে মানগুলির একটি অ্যারে রয়েছে যা আমরা ascending order এ সাজাতে চাই। BubbleSort ফাংশন বারবার অ্যারের মাধ্যমে iterates করে, সংলগ্ন উপাদানগুলির তুলনা করে এবং যদি সেগুলি ভুল order এ থাকে তবে সেগুলি অদলবদল করে। এই প্রক্রিয়াটি চলতে থাকে যতক্ষণ না আর অদলবদলের প্রয়োজন হয়, যা নির্দেশ করে যে অ্যারেটি সাজানো হয়েছে।
নিচের উদাহরণ দেখুন :
<?php echo "Number Sorting"; $numbers = [2,4, 5, 1, 13]; sort($numbers); echo "<pre>"; print_r($numbers); echo "</pre>"; echo "Letters Sorting"; $letters = ['c','a','d','b']; sort($letters); echo "<pre>"; print_r($letters); echo "</pre>"; echo "String Sorting"; $strings=["a"=>"aa","a","aaa","abc","abcd","aaaa"]; sort($strings); echo "<pre>"; print_r($strings); echo "</pre>"; ?>
Output
Number Sorting Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 13 ) Letters Sorting Array ( [0] => a [1] => b [2] => c [3] => d ) String Sorting Array ( [0] => a [1] => aa [2] => aaa [3] => aaaa [4] => abc [5] => abcd )
Note: String এর বেলায় lowest to highest character sorting করার ক্ষেত্রে alphabetically sequence অগ্রাধিকার পায়। এবং যদি কোনো index থাকে সেটা নষ্ট বা numerical sequence index হয়ে যায়।
String Sorting এর বেলায় Array এর String Element গুলো যদি uppercase এবং lowercase এ মিশ্রিত থাকে, সেক্ষেত্রে uppercase letter অগ্রাধিকার পায়, নিচের উদাহরণ দেখুন :
<?php $fruits = array("Orange1", "orange2", "Orange3", "orange20"); sort($fruits); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [0] => Orange1 [1] => Orange3 [2] => orange2 [3] => orange20 )
লক্ষ্য করুন , এখানে Sorting Formula অনুযায়ী Orange1 এর পর orange2 আসার কথা ছিল, কিন্তু সেটা না এসে Orange3 এসেছে।
তবে আপনি চাইলে case insencitive Sort করতে পারেন শুধু দ্বিতীয় Parameter এ flag set করে। নিচের উদাহরণ দেখুন :
<?php $fruits = array("Orange1", "orange2", "Orange3", "orange20"); sort($fruits,SORT_NATURAL | SORT_FLAG_CASE); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [0] => Orange1 [1] => orange2 [2] => Orange3 [3] => orange20 )
PHP rsort() Function
PHP তে array এর value গুলোকে Descending Order বা reverse order এ সাজানোর জন্য rsort() function টি ব্যবহৃত হয়। ফাংশনটি অ্যারের মধ্যে এলিমেন্ট গুলিকে পুনর্বিন্যাস করে যাতে সর্বোচ্চ বা সবচেয়ে বড় value গুলি প্রথমে আসে এবং সর্বনিম্ন বা সবচেয়ে ছোট value গুলি শেষে আসে৷
Note: এই ফাংশনটি অ্যারের উপাদানগুলিতে নতুন key বরাদ্দ করে। এটি বিদ্যমান key গুলিকে reordering অর্থাৎ পুনরায় সাজানোর পরিবর্তে কীগুলিকে রিমুভ করে নতুন numeric key দেবে।
PHP rsort() function syntax()
rsort(array &$array, int $flags = SORT_REGULAR): true
Parameters:
- $array: এখানে input array টি থাকবে।
- flags: optional second parameter টি flags এই মানগুলি ব্যবহার করে সাজানোর আচরণ পরিবর্তন করতে ব্যবহার করা যেতে পারে:
Sorting type flags:
- SORT_REGULAR – সাধারণভাবে আইটেম তুলনা করে ;
- SORT_NUMERIC – আইটেমগুলিকে numerically তুলনা করে ৷
- SORT_STRING – আইটেমগুলিকে string হিসেবে তুলনা করে।
- SORT_LOCALE_STRING – setlocale() current locale এর উপর ভিত্তি করে আইটেমগুলিকে স্ট্রিং হিসাবে তুলনা করে । এটি setlocale()ব্যবহার করে পরিবর্তন করা যেতে পারে
- SORT_NATURAL – natsort() এর মত “natural ordering” ব্যবহার করে আইটেমগুলিকে স্ট্রিং হিসাবে তুলনা করে।
- SORT_FLAG_CASE – case-insensitively স্ট্রিংগুলি সাজানোর জন্য SORT_STRING বা SORT_NATURAL এর সাথে (বিটওয়াইজ বা) একত্রিত করা যেতে পারে
PHP rsort ফাংশন কিভাবে কাজ করে?
PHP-তে rsort() ফাংশন কীভাবে একটি সাধারণ Reverse Order sorting অ্যালগরিদম ব্যবহার করে কাজ করে তার একটি simplified pseudocode উপস্থাপনা এখানে দেওয়া হল।
function rsort(array) n = length(array) do swapped = false for i from 0 to n-2 if array[i] < array[i+1] swap(array[i], array[i+1]) swapped = true end if end for n = n - 1 while swapped end function
এই সিউডোকোডটি আমি পূর্বে প্রদত্ত sort() ফাংশনের সিউডোকোডের অনুরূপ, তবে এখানে একটি গুরুত্বপূর্ণ পার্থক্য হল: এটি উপাদানগুলিকে অদলবদল করে descending order এ সাজায় যখন বাম উপাদানটি ডান উপাদানের চেয়ে কম হয়। প্রক্রিয়াটি চলতে থাকে যতক্ষণ না আর কোন অদলবদলের প্রয়োজন হয়, যার ফলে একটি অ্যারে সাজানো হয় descending order এ।
<?php echo "Number Sorting in Reverse Order"; $numbers = [2,4, 5, 1, 13]; rsort($numbers); echo "<pre>"; print_r($numbers); echo "</pre>"; echo "Letters Sorting in Reverse Order"; $letters = ['c','a','d','b']; rsort($letters); echo "<pre>"; print_r($letters); echo "</pre>"; echo "String Sorting in Reverse Order"; $strings=["a"=>"aa","a","aaa","abc","abcd","aaaa"]; rsort($strings); echo "<pre>"; print_r($strings); echo "</pre>"; ?>
Output
Number Sorting in Reverse Order Array ( [0] => 13 [1] => 5 [2] => 4 [3] => 2 [4] => 1 ) Letters Sorting in Reverse Order Array ( [0] => d [1] => c [2] => b [3] => a ) String Sorting in Reverse Order Array ( [0] => abcd [1] => abc [2] => aaaa [3] => aaa [4] => aa [5] => a )
Note: String এর বেলায় highest to lowest character sorting করার ক্ষেত্রে alphabetically sequence অগ্রাধিকার পায়। এবং যদি কোনো index থাকে সেটা নষ্ট বা numerical sequence index হয়ে যায়।
String Reverse Sorting এর বেলায় Array এর String Element গুলো যদি uppercase এবং lowercase এ মিশ্রিত থাকে, সেক্ষেত্রে lowercase letter অগ্রাধিকার পায়, নিচের উদাহরণ দেখুন :
<?php $fruits = array("Orange1", "orange2", "Orange3", "orange20"); rsort($fruits); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [0] => orange20 [1] => orange2 [2] => Orange3 [3] => Orange1 )
লক্ষ্য করুন , এখানে Sorting Formula অনুযায়ী orange20 এর পর orange3 আসার কথা ছিল, কিন্তু সেটা না এসে orange2 এসেছে।
তবে আপনি চাইলে case insencitive Sort করতে পারেন শুধু দ্বিতীয় Parameter এ flag set করে। নিচের উদাহরণ দেখুন :
<?php $fruits = array("Orange1", "orange2", "Orange3", "orange20"); rsort($fruits,SORT_NATURAL | SORT_FLAG_CASE); print_r($fruits); ?>
Output
Array ( [0] => orange20 [1] => Orange3 [2] => orange2 [3] => Orange1 )
PHP usort() Function
PHP তে usort function টি ও sort function এর মতোই শুধু value গুলোকে sorting করে, পুরাতন index বা key নষ্ট করে ফেলে এবং নতুন করে numerical index assign করে, তবে এটি নিজে sorting করতে পারেনা, এটাকে user বা programmer নিজের তৈরী call back function দিয়ে sorting করিয়ে নিতে হয় । নিচের উদাহরণ দেখুন :
PHP usort() function syntax()
usort(array &$array, callable $callback): true
Parameters:
- $array: এখানে input array টি থাকবে।
- callback:একটি user-defined function যা array থেকে দুটি element এর তুলনা করে এবং তাদের order অর্থাৎ ক্রম নির্ধারণ করে। callback function টি একটি positive integer রিটার্ন করবে যদি প্রথম element টি দ্বিতীয়টির পরে আসে, একটি negative integer যদি এটি আগে আসে, বা zero (শূন্য) যদি তাদের অর্ডার পরিবর্তন করার প্রয়োজন না হয়।
PHP usort ফাংশন কিভাবে কাজ করে?
PHP-তে usort() ফাংশন কীভাবে একটি callback ফাঙ্কশনের সাহায্যে sorting অ্যালগরিদম ব্যবহার করে কাজ করে তার একটি simplified pseudocode উপস্থাপনা এখানে দেওয়া হল।
function usort(array, comparisonFunction) n = length(array) do swapped = false for i from 0 to n-2 if comparisonFunction(array[i], array[i+1]) > 0 swap(array[i], array[i+1]) swapped = true end if end for n = n - 1 while swapped end function
callback function syntax
callback(mixed $element1, mixed $element2): int
আরেকটু সহজ করে বুঝতে চাইলে নিচের উদাহরণটি দেখুন:
function callbackFunction($element1, $element2) { // Comparison logic to determine the order of $element1 and $element2 // Returns a positive integer if $element1 should come after $element2 // Returns a negative integer if $element1 should come before $element2 // Returns 0 if $element1 and $element2 have the same order }
এই সিনট্যাক্সে:
- callbackFunction: এটি user-defined callback ফাংশনের নাম। আপনি যেকোন বৈধ ফাংশনের নাম বেছে নিতে পারেন।
- $element1 এবং $element2: এই অ্যারের দুটি elements যা আপনি sorting প্রক্রিয়ায় compare করতে চান।
- ফাংশনে এমন logic থাকা উচিত যা $element1 এবং $element2 এর তুলনা করে এবং একটি positive integer return করে যদি $element1 $element2 এর পরে আসে, একটি positive integer যদি $element1 $element2 এর আগে আসে, অথবা যদি তাদের অর্ডার পরিবর্তন করার প্রয়োজন না হয় তাহলে 0।
এখানে একটি usort() কলব্যাক ফাংশনের একটি সাধারণ উদাহরণ দেওয়া হলো:
<?php function customSort($a, $b) { if ($a < $b) { return -1; // $a should come before $b } elseif ($a > $b) { return 1; // $a should come after $b } else { return 0; // $a and $b have the same order } // You can write above comparison just using spaceship operator: //return $a<=>$b; } $numbers = [5, 3, 1, 4, 2]; usort($numbers, 'customSort');
এই উদাহরণে, customSort ফাংশন usort() এর জন্য callback function হিসাবে ব্যবহৃত হয়। এটি দুটি সংখ্যার তুলনা করে, এবং যদি প্রথম সংখ্যাটি দ্বিতীয়টির চেয়ে কম হয় তবে এটি -1 প্রদান করে, নির্দেশ করে যে প্রথম সংখ্যাটি দ্বিতীয়টির আগে আসা উচিত। প্রথম সংখ্যাটি বড় হলে, এটি 1 প্রদান করে, যা নির্দেশ করে যে প্রথম সংখ্যাটি দ্বিতীয়টির পরে আসা উচিত। যদি তারা সমান হয়, এটি 0 প্রদান করে। এই কাস্টম sorting logic টি sorting প্রক্রিয়া চলাকালীন অ্যারের উপাদানগুলির order (ক্রম) নির্ধারণ করে।
নিম্নে কয়েকটি সহজ উদাহরণ দেওয়া হলো :
<?php function cmpasc($a, $b){ if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; // You can write above comparison just using spaceship operator: //return $a<=>$b; } function cmpdesc($a, $b) { if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; // You can write above comparison just using spaceship operator: //return $b<=>$a; } $a = $b= array("a"=>3, "b"=>2, "e"=>5, "d"=>6, "f"=>1); usort($a, "cmpasc"); echo "Ascending Order Sorting By Callback Function"; echo "<pre>"; print_r($a); echo "</pre>"; echo "Descending Order Sorting By Callback Function"; usort($b,"cmpdesc"); echo "<pre>"; print_r($b); echo "</pre>"; ?>
Output
Ascending Order Sorting By Callback Function Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 5 [4] => 6 ) Descending Order Sorting By Callback Function Array ( [0] => 6 [1] => 5 [2] => 3 [3] => 2 [4] => 1 )
চলুন আরো একটি প্রাকটিক্যাল উদাহরণ দেখে নেওয়া যাক :
<?php class Student { public $name; public $score; public function __construct($name, $score) { $this->name = $name; $this->score = $score; } } $students = [ new Student("Alice", 89), new Student("Bob", 76), new Student("Charlie", 95), new Student("David", 82), new Student("Eve", 88), ]; usort($students, function($student1, $student2) { return $student2->score - $student1->score; //Or you can use spaceship: return $student2->score <=> $student1->score; }); // After sorting, $students contains students sorted by score in descending order print_r($students);
Output:
Array ( [0] => Student Object ( [name] => Charlie [score] => 95 ) [1] => Student Object ( [name] => Alice [score] => 89 ) [2] => Student Object ( [name] => Eve [score] => 88 ) [3] => Student Object ( [name] => David [score] => 82 ) [4] => Student Object ( [name] => Bob [score] => 76 ) )