Boplo.ir
rss

من در Facebook


جستجو


آخرین مطالب

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

بر و بچ

MyView TakhteShasi Tween

دوستشون دارم

بیلبورد

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

تماس


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

 

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

A new begining
AHHP presents

 

آدرس کوتاه: http://Boplo.ir/:55

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"]);

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

 

شنگول باشید!

 

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


علیرضا : سلام چیز جالبی نوشتی
فیض بردیم
موفق باشی
(2 سال و 8 ماه و 21 روز و 49 دقیقه پیش)

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

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

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

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

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

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

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

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

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

سايتک : سلام

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

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

منتظرم
(2 سال و 2 ماه و 17 ساعت و 28 دقیقه پیش)

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

یک دوست : نوع دوم ک هم به سئرتتون اضافه کنید
$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 سال و 6 ماه و 16 روز و 5 ساعت و 22 دقیقه پیش)

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

محمود : خدا خیرت بده کار راه انداز بود
(1 سال و 3 ماه و 19 روز و 16 ساعت و 24 دقیقه پیش)

كريم : امير حسين جان
از كاري كه كردي خيلي لذت بردم. اينكه تلاش‌هايت را با ديگران به اشتراك بگذاري و مستندات فني را به فارسي توسعه بدي. كاري كه متاسفانه ما ايراني‌ها (و از جمله خود من) كمتر وقت برايش صرف مي‌كنيم. اميدوارم به زودي شاهد موفقيت‌هاي بيشتري برايت باشيم.
(1 سال و 2 روز و 18 ساعت و 1 دقیقه پیش)

somayeh : سلام
من تو فایل php تاریخ دارم. به جای اینکه اول سال باشه بعد ماه بعد روز.برعکسه.چیکار کنم؟
(2 ماه و 7 روز و 2 ساعت و 24 دقیقه پیش)

 

me

امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. فارغ التحصیل مهندسی صنایع هستم. برنامه‌نویسی و طراحی وب می کنم. در واقع Web Developer محسوب میشم. برنامه نویسی و وقت گذرونی با وب تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

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

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

MODx | Template World