PHP Array Sorting Functions Part-1: PHP array sort, rsort, and usort function

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
        )

)

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম 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