PHP Arrays
PHP Arrays পর্ব-৩ : PHP Array Sorting Functions
PHP Array Sorting Functions
PHP সহ যেকোনো Language এই Sorting একটি গুরুত্বপূর্ণ বিষয়, আজকের পর্বে আমরা PHP Language এর Built-in Sorting Function গুলো নিয়ে আলোচনা করব।
PHP sort() Function
PHP তে array এর value গুলোকে ascending order এ সাজানোর জন্য sort() function টি ব্যবহৃত হয়। নিচের উদাহরণ দেখুন :
<?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 টি ব্যবহৃত হয়। নিচের উদাহরণ দেখুন :
<?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 হয়ে যায়।
PHP asort() Function
আমরা ইতিপূর্বে দেখেছি PHP তে array এর value গুলোকে sort() function দিয়ে sorting করলে তার default index গুলো নষ্ট হয়ে যায়। তবে index ঠিক রেখে ascending order এ সাজানোর জন্য asort() function টি ব্যবহৃত হয়। নিচের উদাহরণ দেখুন :
<?php $fruits = array("d"=>"lemon","a"=>"orange","b"=>"banana","e"=>"apple"); asort($fruits); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [e] => apple [b] => banana [d] => lemon [a] => orange )
PHP asort() function vs natsort() function
PHP তে asort function দিয়ে sorting টি মূলতঃ Natural Sorting Algorithm এর পরিবর্তে Standard Sorting Algorithm ব্যবহার করে। যাতে কখনো কখনো unexpected ফলাফল আসতে পারে, আরো ভালো ভাবে বুঝার জন্য নিচের উদাহরণ দেখুন :
<?php $array= array("img12.png", "img10.png", "img2.png", "img1.png"); asort($array); echo "Standard sorting\n"; echo "<pre>"; print_r($array); echo "</pre>"; ?>
Output
Standard sorting Array ( [3] => img1.png [1] => img10.png [0] => img12.png [2] => img2.png )
লক্ষ্য করুন, এখানে img1 এর পর img2 না এসে img10 এবং img12 দেখাচ্ছে , আর এই ধরণের sorting কে বলা হয় Standard Sorting, এখন আপনি যদি চান Natural Sorting অর্থাৎ img1, img2, img10, img12 এইভাবে প্রদর্শন করুক, তাহলে আপনাকে natsort() function টি ব্যবহার করতে হবে। নিচের উদাহরণ টি দেখুন:
<?php $array = array("img12.png", "img10.png", "img2.png", "img1.png"); natsort($array); echo "\nNatural order sorting\n"; echo "<pre>"; print_r($array); echo "</pre>"; ?>
Output
Natural order sorting Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )
PHP natsort() function vs natcasesort() function
এতক্ষণ নিশ্চয় ভাবছেন Standard sorting এর সমস্যাকে আপনি অনায়াসেই natsort () function দিয়ে সমাধান করে ফেলবেন , কিন্তু সমস্যা আরেকটু আছে, আর সেই সমস্যাটা হচ্ছে যদি আপনার array value গুলোতে uppercase এবং lowercase এর character থাকে , নিচের উদাহরণ দেখুন :
<?php $array= array('IMG0.png','img12.png','img10.png','img2.png','img1.png','IMG3.png'); echo "<pre>"; natsort($array); echo "Natural sorting (Case Sensitive)\n"; echo "<pre>"; print_r($array); echo "</pre>"; ?>
Output
Natural sorting (Case Sensitive) Array ( [0] => IMG0.png [5] => IMG3.png [4] => img1.png [3] => img2.png [2] => img10.png [1] => img12.png )
লক্ষ্য করুন , এখানে uppercase এর string গুলো সবার আগে sorting হচ্ছে , অর্থাৎ IMG0.png, IMG3.png, img1.png, img2.png এইভাবে sorting হচ্ছে , এখানে আসা উচিত ছিল IMG0.png, img1.png, img2.png, IMG3.png এইভাবে। আর এই ধরণের case জনিত সমস্যা আপনি সহজেই php natcasesort() function দিয়ে সমাধান করতে পারেন। নিচের উদাহরণ দেখুন :
<?php $array= array('IMG0.png','img12.png','img10.png','img2.png','img1.png','IMG3.png'); natcasesort($array); echo "\nNatural order sorting (case-insensitive)\n"; echo "<pre>"; print_r($array); echo "</pre>"; ?>
Output
Natural order sorting (case-insensitive) Array ( [0] => IMG0.png [4] => img1.png [3] => img2.png [5] => IMG3.png [2] => img10.png [1] => img12.png )
PHP arsort() Function
PHP তে arsort টি ও asort এর মতোই index ঠিক রেখে Sorting করে , তবে এটি ascending order এর পরিবর্তে Descending Order এ array এর value গুলোকে Sorting করে । নিচের উদাহরণ দেখুন :
<?php $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "e" => "apple"); arsort($fruits); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [a] => orange [d] => lemon [b] => banana [e] => apple )
PHP ksort() Function
উপরের সবগুলো sorting ই ছিল মূলতঃ value কে sorting করা , আপনি চাইলে array এর key কেও sorting করতে পারেন। PHP তে key এর ভিত্তিতে ascending order এ sorting করার জন্য ksort function টি ব্যবহৃত হয় । নিচের উদাহরণ দেখুন :
<?php $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "e" => "apple"); ksort($fruits); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [a] => orange [b] => banana [d] => lemon [e] => apple )
PHP krsort() Function
PHP তে krsort টি ও ksort এর মতোই , তবে এটি ascending order এর পরিবর্তে Descending Order এ array এর key গুলোকে Sorting করে । নিচের উদাহরণ দেখুন :
<?php $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "e" => "apple"); krsort($fruits); echo "<pre>"; print_r($fruits); echo "</pre>"; ?>
Output
Array ( [e] => apple [d] => lemon [b] => banana [a] => orange )
PHP usort() Function
PHP তে usort function টি ও sort function এর মতোই শুধু value গুলোকে sorting করে, পুরাতন index বা key নষ্ট করে ফেলে এবং নতুন করে numerical index assign করে, তবে এটি নিজে sorting করতে পারেনা, এটাকে user বা programmer নিজের তৈরী call back function দিয়ে sorting করিয়ে নিতে হয় । নিচের উদাহরণ দেখুন :
<?php function cmpasc($a, $b){ if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } function cmpdesc($a, $b) { if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; } $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 uasort() Function
PHP তে uasort function টি ও usort function এর মতোই শুধু value গুলোকে sorting করে তবে পুরাতন index বা key নষ্ট করেনা, অর্থাৎ পুরাতন index বা key রেখেই value গুলোকে sorting করে , এবং এটিও usort function এর মতোই নিজে sorting করতে পারেনা, এটাকে user বা programmer নিজের তৈরী call back function দিয়ে sorting করিয়ে নিতে হয় । নিচের উদাহরণ দেখুন :
<?php function cmpasc($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } function cmpdesc($a, $b) { if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; } $a = $b= array("a"=>3, "b"=>2, "f"=>5, "d"=>6, "e"=>1); uasort($a, "cmpasc"); echo "Ascending Order Sorting By Callback Function"; echo "<pre>"; print_r($a); echo "</pre>"; echo "Descending Order Sorting By Callback Function"; uasort($b,"cmpdesc"); echo "<pre>"; print_r($b); echo "</pre>"; ?>
Output
Ascending Order Sorting By Callback Function Array ( [e] => 1 [b] => 2 [a] => 3 [f] => 5 [d] => 6 ) Descending Order Sorting By Callback Function Array ( [d] => 6 [f] => 5 [a] => 3 [b] => 2 [e] => 1 )
PHP uksort() Function
PHP তে uksort function টি ও usort function এর মতোই user বা programmer নিজের তৈরী call back function দিয়ে sorting করিয়ে নিতে হয় । তবে সেটা array value কে sort করে না। সেটা array এর key গুলোকে sorting করে। নিচের উদাহরণ দেখুন :
<?php function cmpasc($a, $b){ if ($a == $b){ return 0; } return ($a < $b) ? -1 : 1; } function cmpdesc($a, $b) { if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; } $a = $b= array("a"=>3, "b"=>2, "f"=>5, "d"=>6, "e"=>1); uksort($a, "cmpasc"); echo "Ascending Order Sorting By Callback Function"; echo "<pre>"; print_r($a); echo "</pre>"; echo "Descending Order Sorting By Callback Function"; uksort($b,"cmpdesc"); echo "<pre>"; print_r($b); echo "</pre>"; ?>
Output
Ascending Order Sorting By Callback Function Array ( [a] => 3 [b] => 2 [d] => 6 [e] => 1 [f] => 5 ) Descending Order Sorting By Callback Function Array ( [f] => 5 [e] => 1 [d] => 6 [b] => 2 [a] => 3 )
PHP array_multisort() Function
তবে সে ক্ষেত্রে প্রথম array টি sorting হবে , এবং দ্বিতীয় array এর value গুলো প্রথম array এর sorted value গুলোর index বরাবর বসবে। নিচের উদাহরণ দেখুন :
<?php $ar1 = array(10, 100, 100, 0); $ar2 = array(1, 3, 2, 4); array_multisort($ar1, $ar2); echo "<pre>"; print_r($ar1); print_r($ar2); ?>
Output:
Array ( [0] => 0 [1] => 10 [2] => 100 [3] => 100 ) Array ( [0] => 4 [1] => 1 [2] => 2 [3] => 3 )
Database থেকে আসা data কে Multisort:
<?php $data=[ ['volume' => 67, 'edition' => 2], ['volume' => 86, 'edition' => 1], ['volume' => 85, 'edition' => 6], ['volume' => 98, 'edition' => 2], ['volume' => 86, 'edition' => 6], ['volume' => 67, 'edition' => 7] ]; // Obtain a list of columns foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); echo "After Sorting"; echo "<table border='1' width='100' cellpadding='5' cellspacing='0'>"; echo "<tr><th>Volume</th><th>Edition</th></tr>"; foreach($data as $value){ extract($value); echo "<tr><td>$volume</td><td>$edition</td></tr>"; } echo "</table>"; ?>
Output
After Sorting
Volume | Edition |
---|---|
98 | 2 |
86 | 1 |
86 | 6 |
85 | 6 |
67 | 2 |
67 | 7 |