PHP তে Alphanumeric Array Sorting বিড়ম্বনা

PHP তে Array কে খুব সহজেই বিভিন্ন অ‍র্ডারে Sort করা যায়। কিন্তু হঠাৎ সমস্যায় পড়ে গেলাম Alphanumeric Array Sorting এর ক্ষেত্রে। যেমন:

$arr = array(
        "N1",
        "N10",
        "N12",
        "N19",
        "N2",
        "N4",
        "N5",
        "N6",
        "N7",
        "N8",
        "NW1",
        "NW11",
        "NW3",
        "NW5"
);

এটাকে Sort করতে হবে এমন করে:

$arr = [
        "N1",
        "N2",
        "N4",
        "N5",
        "N6",
        "N7",
        "N8",
        "N10",
        "N12",
        "N19",
        "NW1",
        "NW3",
        "NW5",
        "NW11"
];

সেক্ষেত্রে natsort() function ব্যবহার করে খুব সহজেই কাজটা হয়ে গেল:

natsort($arr);

এ প‍র্যন্ত সব ঠিকঠাকই ছিল। কিন্তু সমস্যা দেখা দিল এটাকে json_encode() ফাংশন দিয়ে Json আউটপুট দিতে গিয়ে। আউটপুট Array না হয়ে Object হয়ে যাচ্ছে:

"arr": {
        "0": "N1",
        "4": "N2",
        "5": "N4",
        "6": "N5",
        "7": "N6",
        "8": "N7",
        "9": "N8",
        "1": "N10",
        "2": "N12",
        "3": "N19",
        "10": "NW1",
        "12": "NW3",
        "13": "NW5",
        "11": "NW11"
}

অনেকটা সময় ব্যয় করেও কোনো সমাধানে পৌঁছাতে পারছিলাম না। অবশেষে অনেক খোজখুজির পর Stackoverflow একটা পোস্ট দেখে ঘটনা বুঝতে পারলাম! ঘটনা হয়েছে এমন-

  • natsort() ফাংশন দিয়ে Sort করার ফলে Array key (index) গুলো উল্টাপাল্টা হয়ে গেছে।
  • Array key গুলোর অ‍র্ডার নষ্ট হয়ে গেছে। দে‍খা যাচ্ছে 0 এর পর 4 এসে গেছে।
  • json_encode তখই PHP Array কে Json Array তে রুপান্তর করবে যখন সেটা 0, 1, 2, 3… এমন Sequential Array হবে।

এই সমস্যার সমাধান হিসেবে এটাকে আগে re-index করতে হবে। তারপর json_encode করতে হবে। যেমন:

$newArr = array_values($arr);
echo json_encode($newArr);

অবশেষে কাঙ্খিত ফলাফল:

"arr": [
        "N1",
        "N2",
        "N4",
        "N5",
        "N6",
        "N7",
        "N8",
        "N10",
        "N12",
        "N19",
        "NW1",
        "NW3",
        "NW5",
        "NW11"
]

Leave a Reply

Your email address will not be published. Required fields are marked *