Sorting همیشه فارسی - تابع Persian Sort
۲۹ اردیبهشت ۱۳۸۸ ساعت ۰۲:۴۴
پی اچ پی
مرتب کردن براساس الفبای فارسی
توی برنامه نویسی پیش میاد که بخوایم یه سری اطلاعات فارسی رو براساس الفبای فارسی مرتب کنیم. من می دونستم که PHP با فارسی میونه خوبی نداره ولی نمی دونستم چقدر. فکر می کردم mbstring یا iconv این مشکلات رو حل کردند ولی تازه فهمیدم اشتباه فکر می کردم که PHP با فارسی (یونیکد) میونه خوبی نداره در واقع اصلا میونه ای بینشون نیست که بخواد خوب یا بد باشه!
در PHP6 ظاهرا قراره یه کارایی انجام بدن که تو سرشون بخوره! همین الان خیلی از هاستینگها حاضر نیستند PHP5 نصب کنند، PHP6 برای End-user ایرانی شیرین حواله 10 ساله دیگه است!
اخیرا به یک مبحثی در رابطه با Sort کردن سطرهای MySQL برخوردم. خواستم این مشکل رو با خود MySQL حل کنم، دیدم حدود یک میلیارد حلقه و کوئری MySQL نیاز داره تازه نیاز به تجسم این یک میلیارد عملیات داشت که از ظرفیت ذهن اینجانب خارج می باشد.
دنبال راه حل جدید میگشتم که ذهنم رفت سراغ توابع دقیق Sorting برای الفبای انگلیسی. گفتم اینا تو بلاد کفر به چه راحتی Sort می کنند خوب بیام یه جوری الفبای فارسی رو با الفبای انگلیسی متناظر کنم و ترتیب رو ازش خارج کنم (اگه متوجه شدی، زود بگو چی گفتم؟! چون خودم دقیق نفهمیدم!)
تابع sort این کار رو می کنه ولی نه فارسی بلکه عربی.
خلاصه، یه تابع به نام psort نوشتم که آرایه میگیره و براساس الفبای فارسی مرتب می کنه. به این صورت که اول اعداد فارسی، بعد حروف فارسی و بعد اعداد و حروف انگلیسی.... حسن این تابع به توابع خود PHP اینه که شما می تونید ترتیب الفبا رو هر جور دوست دارید تغییر بدید مثلا همزه رو اول یا آخر الفبا قرار بدید و غیره و ذالک.
array psort($input_arr [, $function="asort"]);
اولین پارامتر آرایه ای هست که قراره مرتب بشه
و دومین پارامتر (که اختیاری هست) مخصوص تعیین تابعی هست که میخواید باهاش Sort رو انجام بدید.مقدار پیشفرض این پارامتر "asort" تعیین شده یعنی آرایه توسط تابع asort مرتب میشه. اگر احیانا خواستی کنجکاوی کنی و تابعهای جورواجور و غیرمرتبط بهش بدی ببینی چی میشه، نمی خواد امتحان کنی! من بهت میگم، error قشنگ میده!
و خروجی هم همونطور که کاملا واضحه، آرایه مرتب شده است.
نمونه:
$arr1 = array(
"امیرحسین" => "AHHP",
"graphic" => "گرافیک",
"MRKay" => "محمدرضا",
"number" => "23"
);
$arr2 = array(
"امیرحسین" , "محمدرضا", "AHHP",
"مرتب سازی فارسی", "Boplo.ir عزیز"
);
echo "<pre>";
print_r( psort($arr1) );
print_r( psort($arr2) );
echo "</pre>";
// Output
Array
(
[graphic] => گرافیک
[MRKay] => محمدرضا
[number] => 23
[امیرحسین] => AHHP
)
Array
(
[0] => امیرحسین
[1] => محمدرضا
[3] => مرتب سازی فارسی
[2] => AHHP
[4] => Boplo.ir عزیز
)
تابع کوتاه هست و منطق ساده ای داره. یه آرایه اصلی برای الفبا داره که می تونید ترتیب حروف رو به هر شکلی که دوست دارید تغییر بدید. مثلا جای اعداد فارسی (که کم کاربرد هستند) اعداد انگلیسی رو قرار بدید که اعداد قبل از حروف بیان.
خودم چند مدل تستش کردم و جواب داد. انشاالله که مشکلی هم نداره.
شنگول باشید!


Google Chrome

تو چی فکر می کنی؟