Boplo.ir
rss


جستجو

آخرین مطالب

 

 

مطالب همینجوری

 

 

بر و بچ

MyView Tween


دوستشون دارم


بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

Sorting همیشه فارسی - تابع Persian Sort
29 اردیبهشت 1388 ساعت 02:44

پی اچ پی
مرتب کردن براساس الفبای فارسی

توی برنامه نویسی پیش میاد که بخوایم یه سری اطلاعات فارسی رو براساس الفبای فارسی مرتب کنیم. من می دونستم که 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"]);

Persian sort function

اولین پارامتر آرایه ای هست که قراره مرتب بشه
و دومین پارامتر (که اختیاری هست) مخصوص تعیین تابعی هست که میخواید باهاش 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 عزیز
)

تابع کوتاه هست و منطق ساده ای داره. یه آرایه اصلی برای الفبا داره که می تونید ترتیب حروف رو به هر شکلی که دوست دارید تغییر بدید. مثلا جای اعداد فارسی (که کم کاربرد هستند) اعداد انگلیسی رو قرار بدید که اعداد قبل از حروف بیان.

خودم چند مدل تستش کردم و جواب داد. انشاالله که مشکلی هم نداره.

 

Download psort.function.zip

 

شنگول باشید!

 

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


علیرضا : سلام چیز جالبی نوشتی
فیض بردیم
موفق باشی
(1 سال و 3 ماه و 23 روز و 59 دقیقه پیش)

نبی : یه pdf توی سایت iranphp.com بود که در اون برای مرتب سازی آرایه، یه تابع وجود داشت...
البته اگر charset و collecion های فیلهای دیتابیس درست تنظیم شده باشند با همون order هم به درستی میشه در سطح دیتابیس با سرعت بیشتر مرتب سازی رو بر اساس دقیقاً حروف فارسی (حتی عربی هم نه!) انجام داد.
(1 سال و 3 ماه و 21 روز و 13 ساعت و 57 دقیقه پیش)

ahmad : سلام
من دنبال تابع سورتینگ فارسی میگشتم که مال تو رو پیدا کردم.
تابعتو خوندم و به نظرم روشی که استفاده کردی چندان جالب و اصولی نیست که یک مرحله حروف فارسی رو به انگلیسی تبدیل کنی و بعد با خودتابع php سورت کنی و بعد دوباره به فارسی برگردونی.
اگه الگوریتمهای سورت کردن رو مطالعه کنی می بینی که خیلی راحت میشه یکیشو برای حروف فارسی پیاده کرد که به زودی این کار رو انجام میدم.
(1 سال و 1 ماه و 15 روز و 11 ساعت و 37 دقیقه پیش)

امیرحسین : @نبی: من پیگیر یه بحث طولانی در این زمینه بودم و در آخر نتیجه اینطور بود که sort فارسی در MySQL فقط توسط تابع BINARY قابل انجامه و روش collation کامل نیست.

@احمد: من خودم خیلی تو اینترنت سرچ کردم و به جایی نرسیدم. شما هم سرچ کردید و به اینجا رسیدید. یعنی فعلا همین وجود داره تا شما یا هرکس دیگه ای، یه نسخه بهینه تر طراحی کنه.
(1 سال و 1 ماه و 15 روز و 6 ساعت و 9 دقیقه پیش)

محسن : سلام
من یک بانک با یک جدول دارم که 5 ستون دارند. میخوام اونا رو بر اساس نام خانوادگی مرتب کنم .

هر کار میکنم نمیشه.الان یه 6 ماهی میشه باهاش درگیرم.
لطفا کمکم کنین.
(1 سال و 6 روز و 15 ساعت و 13 دقیقه پیش)

امیرحسین : @ محسن: من تا حالا خودم تست نکردم. یه سری میگن روش collation جواب میده و یه سری میگن روش BINARY.
به این آدرس برید: http://barnamenevis.org/forum/showthread.php?t=77295
(1 سال و 6 روز و 11 ساعت و 12 دقیقه پیش)

محسن : بابا جان . میخام بدونم این تابع بصورت عملی در جداول مای اس کیو ال چجوری کار میکنه . خود مای اس کیو ال نمیتونه بابا نمیتونه مرتب کنه .نه باینری نه هیچ چیز دیگه .بابام جان یکی بدادم برسه.چند بار قصد کردم برم دنبال asp ولی نتونستم ....
(1 سال و 4 روز و 19 ساعت و 51 دقیقه پیش)

امیرحسین : این تابع sort آرایه است نه MySQL!
اگه خیلی کارتون گیره، می تونید سطرهای جدول رو به صورت آرایه به تابع بدید و مرتبشون کنید
که البته این کار چندان بهینه نیست ولی کار رو راه می اندازه.
(1 سال و 4 روز و 16 ساعت و 53 دقیقه پیش)

سايتک : سلام

بلاد كفر رو خوب اومدي

ژيه كاري با شما داشتم مي‌تونم درخواست كنم اگر حاضريد به بنده كمك كنيد به ايميل بنده يك پيام بفرستيد؟

منتظرم
(9 ماه و 7 روز و 17 ساعت و 38 دقیقه پیش)

مهدی : سلام تابعی که زمان را به وقت تهران به دیتا بیس insert میکند جیست؟ ممنون
(4 ماه و 22 ساعت و 12 دقیقه پیش)

یک دوست : نوع دوم ک هم به سئرتتون اضافه کنید
$alphabet = array(
'$A$' => "۰", '$B$' => "۱", '$C$' => "۲",
'$D$' => "۳", '$E$' => "۴", '$F$' => "۵",
'$G$' => "۶", '$H$' => "۷", '$I$' => "۸",
'$J$' => "۹", '$K$' => "آ", '$L$' => "ا",
'$M$' => "أ", '$N$' => "إ", '$O$' => "ؤ",
'$P$' => "ئ", '$Q$' => "ء", '$R$' => "ب",
'$S$' => "پ", '$T$' => "ت", '$U$' => "ث",
'$V$' => "ج", '$W$' => "چ", '$X$' => "ح",
'$Y$' => "خ", '$Z$' => "د", '$a$' => "ذ",
'$b$' => "ر", '$c$' => "ز", '$d$' => "ژ",
'$e$' => "س", '$f$' => "ش", '$g$' => "ص",
'$h$' => "ض", '$i$' => "ط", '$j$' => "ظ",
'$k$' => "ع", '$l$' => "غ", '$m$' => "ف",
'$n$' => "ق", '$o$' => "ک", '$q$' => "گ",
'$r$' => "ل", '$s$' => "م", '$t$' => "ن",
'$u$' => "و", '$v$' => "ه", '$w$' => "ی",
'$x$' => "ي", '$y$' => "ۀ", '$z$' => "ة",'$p$'=>"ك"
);
(1 ماه و 18 روز و 5 ساعت و 31 دقیقه پیش)

elaheh : تابع psort برای مرتب سازی با حروف الفبا قابل دانلود شدن نیست خواهش می کنم راهنمایی کنید
(2 روز و 22 ساعت و 14 دقیقه پیش)
نام:
ایمیل: (منتشر نخواهد شد!)
وب سایت:

کد امنیتی: اگر در خواندن این کد مشکلی دارید، اینجا کلیک کنید تا صفحه بازخوانی شود.

 

me امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. دانشجوی رشته صنایع هستم شغل درست و حسابی ندارم. طراحی وب می کنم ولی همه اش واسه سرگرمی بوده. برنامه نویس PHP هستم. برنامه نویسی و وقت گذرونی با کامپیوتر تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

این سایت رو بعد از کلی اینور اونور دوباره راه انداختم تا هرچی دوست دارم توش بنویسم، چه کسی بخونه چه نخونه.
خلاصه اینجا خونه منه،

به خونه امیرحسین خوش اومدی...

MODx | Template World