PHP Arrays পর্ব-৩ : PHP Array Sorting Functions

PHP Array Sorting Functions

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
)

Zend Certified PHP Engineering (ZCPE) Course

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
)

Zend Certified PHP Engineering (ZCPE) Course

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
)

Zend Certified PHP Engineering (ZCPE) Course

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
)

Zend Certified PHP Engineering (ZCPE) Course

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
)

Zend Certified PHP Engineering (ZCPE) Course

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

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply