113

113

تابع مرتب سازی فارسی

http://www.iranphp.net

1

عنوان مقاله

: تابع مرتب سازی فارسی

نگارنده

: .………………

آدرس پست الکترونیک

: .………………

تاریخ نگارش

: …….…………

http://www.iranphp.net

2

تابع مرتب سازی فارسی

:

<

<?

$test2

meta http-equiv="Content-Type" content="text/html; charset=utf-8">php[ ; "پیمان"=[ 0

$test2

[1]="ali";

$test2

[2]="xxxi";

$test2

[ ;"آرزو"=[ 3

$test2

[ ;"چرچیل"=[ 4

$test2

[ ;"ژاله"=[ 5

$test2

[ ;"گرمایش"=[ 6

$test2

[ ;"ماندنی"=[ 7

$test2

[ ;"رضا"=[ 8

$test2

[ ;"پژوھش"=[ 9

$test2

[ ;"یاد"=[ 10

for

($i=0;$i<=10;$i++) $test2[$i] =fa_encode($test2[$i] );

sort

($test2);

for

{

($i=0;$i<=10;$i++)

echo

}

fa_decode($test2[$i]) ."<br>" ;

function

fa_decode($str){

$_to_farsi

=array(

chr

(131).chr(48) => chr(216).chr(162),

chr

(131).chr(49) => chr(216).chr(167),

chr

(131).chr(50) => chr(216).chr(168),

chr

(131).chr(51) => chr(217).chr(190),

chr

(131).chr(52) => chr(216).chr(170),

chr

(131).chr(53) => chr(216).chr(171),

chr

(131).chr(54) => chr(216).chr(172),

chr

(131).chr(55) => chr(218).chr(134),

chr

(131).chr(56) => chr(216).chr(173),

chr

(131).chr(57) => chr(216).chr(174),

chr

(131).chr(65) => chr(216).chr(175),

chr

(131).chr(66) => chr(216).chr(176),

chr

(131).chr(67) => chr(216).chr(177),

chr

(131).chr(68) => chr(216).chr(178),

chr

(131).chr(69) => chr(218).chr(152),

chr

(131).chr(70) => chr(216).chr(179),

chr

(131).chr(71) => chr(216).chr(180),

chr

(131).chr(72) => chr(216).chr(181),

chr

(131).chr(73) => chr(216).chr(182),

chr

(131).chr(74) => chr(216).chr(183),

chr

(131).chr(75) => chr(216).chr(184),

chr

(131).chr(76) => chr(216).chr(185),

chr

(131).chr(77) => chr(216).chr(186),

chr

(131).chr(78) => chr(217).chr(129),

chr

(131).chr(79) => chr(217).chr(130),

chr

(131).chr(80) => chr(218).chr(169),

chr

(131).chr(81) => chr(218).chr(175),

chr

(131).chr(82) => chr(217).chr(132),

chr

(131).chr(83) => chr(217).chr(133),

http://www.iranphp.net

3

chr

(131).chr(84) => chr(217).chr(134),

chr

(131).chr(85) => chr(217).chr(136),

chr

(131).chr(86) => chr(217).chr(135),

chr

(131).chr(87) => chr(219).chr(140));

return

}

strtr($str,$_to_farsi);

function

fa_encode($str){

$_to_safe

=array(

chr

(216).chr(162) => chr(131).chr(48),

chr

(216).chr(167) => chr(131).chr(49),

chr

(216).chr(168) => chr(131).chr(50),

chr

(217).chr(190) => chr(131).chr(51),

chr

(216).chr(170) => chr(131).chr(52),

chr

(216).chr(171) => chr(131).chr(53),

chr

(216).chr(172) => chr(131).chr(54),

chr

(218).chr(134) => chr(131).chr(55),

chr

(216).chr(173) => chr(131).chr(56),

chr

(216).chr(174) => chr(131).chr(57),

chr

(216).chr(175) => chr(131).chr(65),

chr

(216).chr(176) => chr(131).chr(66),

chr

(216).chr(177) => chr(131).chr(67),

chr

(216).chr(178) => chr(131).chr(68),

chr

(218).chr(152) => chr(131).chr(69),

chr

(216).chr(179) => chr(131).chr(70),

chr

(216).chr(180) => chr(131).chr(71),

chr

(216).chr(181) => chr(131).chr(72),

chr

(216).chr(182) => chr(131).chr(73),

chr

(216).chr(183) => chr(131).chr(74),

chr

(216).chr(184) => chr(131).chr(75),

chr

(216).chr(185) => chr(131).chr(76),

chr

(216).chr(186) => chr(131).chr(77),

chr

(217).chr(129) => chr(131).chr(78),

chr

(217).chr(130) => chr(131).chr(79),

chr

(218).chr(169) => chr(131).chr(80),

chr

(218).chr(175) => chr(131).chr(81),

chr

(217).chr(132) => chr(131).chr(82),

chr

(217).chr(133) => chr(131).chr(83),

chr

(217).chr(134) => chr(131).chr(84),

chr

(217).chr(136) => chr(131).chr(85),

chr

(217).chr(135) => chr(131).chr(86),

chr

(219).chr(140) => chr(131).chr(87));

return

}

?>

strtr($str,$_to_safe);

تهیه شده است

را درج کنند

مشکلی نخواهند داشت

و حرفی باشد جواب صحیح خواهد داد

IranPHP این تابع توسط آقای شیرازی و امید متقی در انجمنcharset=utf- ذخیره کنند . فرانت پیچی ها هم اگر 8 UTF- کار میکنند باید فایل را به صورت 8 NotePad کسانی که با.(باید به خطار داشته باشید که اگر متن فارسی یه شکلکد شود یعنی عددی تمایش داده شود برنامه قادر به سورت صحیح نخواهد بود و). uTF- فقط وقتی به صورت 8

الگوی یکتا و بکارگیری آن در 5 php

http://www.iranphp.net

1

php

عنوان مقاله : الگوی یکتا و بکارگیری آن در 5

نگارنده

: آرش میکائیلی

arash@iranphp.net

تاریخ نگارش

: آدرس پست الکترونیک: ............

http://www.iranphp.net

2

licensed under the Creative Commons

تمام مطالب این نوشته تحت مجوز (disclaimer) : گواهی رد ادعا

منتشر می شود، برای دریافت نسخه ای از این مجوز می توانید به آدرس زیر مراجعه کنید

: Attribution License

http://creativecommons.org/licenses/by/2.0/

و همچنین بعضی از نکات و روشهای نوشتن یه کد خوب

اشاره خواهد شد

آشنا باشند

تست شده است

PHP و نحوه بکار گیری آن در 5 (Singleton Pattern) در این مقاله به شرح الگوی یکتا.مخاطبین این مقاله برنامه نویسانی هستند که مایلند از تکنیکهای برنامه نویسی شی گرا در کارهاشون استفاده کنند و البته نیاز دارن که با. PHP در 5 OOP مبانی. FC و سیستم عامل 4 PHP 5.5-MySQL 4.1.14-Apache تمام کدهای این مقاله بر روی 2.0.54

الگوی یکتا چیست ؟

می دم تا با ایده اصلی کمی آشنا بشین

روشی برای برنامه نویساست تا از دوباره کاری ها اجتناب بشه و از دانش و مهارت افراد دیگه توی مسائلی که به صورت معمول پیش

Design Patterns پیش از اینکه به توضیح در مورد این الگوی خاص بپردازم ،توضیح مختصری راجع بهDesign Patterns

می آد و یا شبیه به هم هستند استفاده کنن و همچنین دانش و مهارت خودشون را با بقیه سهیم بشن

.

هر الگو دستورالعمل انجام کار خاصیه بصورتی که موثر بودن آن به اثبات رسیده

.

الگوی یکتا

:

از یک کلاس در کل اسکریپت داشته باشیم و این معمولا وقتی پیش می آد که شی مورد نظر یه

را بین اجزا مختلف برنامه به اشتراک بذارن

instance در خیلی از موارد بهتره که ما فقط یک.مثلا (instance) منحصر به فرد را در سیستم مشخص می کنن و یا اینکه بخوان یک نمونه component

باشه که تو جاهای مختلف برنامه ازش

استفاده می کنیم

ساختن شی جدید می شه صرفه جویی می کنیم

DB از کلاس (instance) وقتی که ما از دیتابیس تو برناممون استفاده می کنیم دیتابیس می تونه یه نمونه. به عبارت دیگه با استفاده از این الگو می تونیم از تولید اشیاء تکراری جلوگیری کنیم و در نتیجه در استفاده از حافظه و زمانی که برای.

کلاسهایی که می خوایم در قالب این الگو باشند با ید شرایط زیر را داشته باشن

:

هیچ راهی برای تولید نمونه دیگری از شئ مورد نظر نباید وجود داشته باشد

.

تا زمانی که نیاز نیست نباید ساخته شود

.

پیدا کردنش نیز باید راحت باشه

.

توضیح مفصل این موارد خیلی طول می کشه و خسته کننده می شه در نتیجه فقط به

برسونم

ذکر عناوین بسنده می کنم و پیاده سازی یه مثال سعی می کنم منظورم را.

PHP

پیاده سازی الگوی یکتا در: 5

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

کنیم اینجوری فقط یکی از متدهای خود کلاس می تونه نمونه جدید

ئن بشیم که راهی برای تولید شئ خارج از مداری که ما می خوایم وجود نداره پس ساختنprivate گرفتن)را ممنوع می کنم ؟! فقط کافیه که تابع سازنده را instance)

بسازه

.

private

function __construct($dbHost,$dbUser,$dbPass,$dbName) {

//do something

}

و با دسترسی

بهتریت راه حله

static پس به یه متد نیاز داریم که بدون اینکه نیاز باشه نمونه ای از کلاس ساخته بشه اون را اجرا کنیم؟! برای این کار استفاده از یه متود. public

http://www.iranphp.net

3

static function

getInstance(){

//create new instance in first call

if

(self::$instance==null) {

new class

}

();

return

}

self::$instance;

حالا فقط مونده که بتونیم جلوی تولید چند شی با استفاده از این متود را بگیریم به عبارت دیگه هروقت که این متود صدا می شه باید بتونه تشخیص بده که آیا

قبلا صدا شده یا نه

استفاده می کنیم تا بتونیم همیشه مقدارش را چک کنیم و در عین حال امکان ت

مقدار هم خار

! اگه دفعه اول بود یه شی جدید بسازه و اگه قبلا ساخته بود بجای اینکه دوباره یه نمونه بسازه همون قبلی را برگردونه .برای این کار هم از یهغییر این private با دسترسی (property) static ویژگیج از کلاس وجود نداشته باشه.

static

private $instance=null;

حله

. private با دسترسی __clone() شدن شی را هم بگیریم که اونم از طریق تعریف متود clone حالا فقط می مونه که جلوی

private

{

}

function __clone()

یک مثال واقعی از الگوی یکتا

:

نشان داده می شود

: MySQLi در این مثال نحوه ایجاد یک شی از کلاس

<?

PHP

/**

* PHP version 5

*

* This source file is subject to version 2.1 of the GNU Lesser General Public

* License, that is bundled with this package in the file COPYING, available

* through the world wide web at the following URI:

* http://www.gnu.org/copyleft/lesser.html.

*

* <i>smysqli class </i> Singelton Improved Mysql<br />

* this is a very simple wrapper class that uses singleton pattern to avoid creating multiple links

* in a single application to mysql database<br />

*

* an example of how to use this class :

* <code>

* //creating DB object

* $dbObject=smysqli::getInstance('localhost','arash','arash','usersdb');

* //sending query to DB

* $dbObject->query('select * from tblUsers');

* //using object property

* echo $dbObject->affected_rows;

* </code>

* @package DataBase

* @author Arash Mikaeili <arash@iranphp.net>

* @copyright 2005 iranphp.net

* @license LGPL License 2.1 <http://www.gnu.org/copyleft/lesser.html>

* @version SVN $Id$

* @link http://www.iranphp.net

*/

class

smysqli {

/**

* Private constructor to avoid <i>smysqli</i> object creation.

*

http://www.iranphp.net

4

* @access private

* @param string $dbHost the mysql hostname or ip

* @param string $dbUser

* @param string $dbPass

* @param string $dbName the DataBase we want to use

* @return void

* @version SVN $Id$

*/

private

function __construct($dbHost,$dbUser,$dbPass,$dbName) {

self

::$instance=new mysqli($dbHost,$dbUser,$dbPass,$dbName) ;

if

(mysqli_connect_errno()) {

throw

new Exception('connect failed: '.mysqli_connect_error());

exit

}

}

();

/**

* Private clonator to avoid <i>smysqli</i> object clonation.

*

* @access private

*/

private

{

}

function __clone()

/**

* Create new mysqli object or just return the already existed one

*

* @static

* @access public

* @param string $dbHost the mysql hostname or ip

* @param string $dbUser

* @param string $dbPass

* @param string $dbName the DataBase we want to use

* @return object mysqli

* @version SVN $Id$

*/

static function

getInstance($dbHost,$dbUser,$dbPass,$dbName){

//create new smysqli object in first call

if

(self::$instance==null) {

new

}

smysqli($dbHost,$dbUser,$dbPass,$dbName);

return

}

self::$instance;

/**

* @var object mysqli

* @access private

* @static

*/

static

}

?>

private $instance=null;

با توجه به توضیحاتی که در بالا دادم و حاشیه نویسی که در خود کد وجود داره دیگه نیاز

بر می گردنه

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

ی به شرح خط به خط کد نیست تنها کاری که این کلاس انجام می ده. mysqli اینه که یه شی یکتا از کلاسث این مقاله مربوط نباشه:

استفاده کنید

اگه یه روزی خواستین این کد را بصورت بازمتن منتشر کنید محبوبیت بیشتری پیدا کنه

.این کار باعث می شه که هم خودتون بعدا راحتتر از کدی که نوشتین سر در بیارین و هم اینکه Comment تا جایی که می تونید تو کدتون از.

http://www.iranphp.net

5

را فراموش نکیند بطور کلی هر وقت که مش

غول برنامه نویسی هستین یا باید کد جدید بنویسید یا اینکه کدهای قبلیتون را بازسازی و بهینه Refactoring

را بصورت پارامتر بگیره اونا بصورت ثابت تو خود کلاس باشن بهتره هم باع

هم استفاده کنین، دیگه لازم

نیست کدتون را در تمام برنامه ت

ث می شه که استفاده از DB کنید .مثلا همین مثال بالا اگه بجای اینکه مشخصاتinit تنها از connect کلاس راحتتر بشه و هم اینکه اگه یه روزی خواستین تعداد این پارامترها را تغییر بدین مثلا بجایغییر بدین فقط کافیه تغییرات را در همین کلاس انجام بدین خود به خود همه جا اعمال می شه.

استفاده کنید

استفاده نکنین اهمیتش را متوجه نمی شین

.حتی اگه می خواین یه کلاس کوچیک یا یه تابع بنویسید و تنها برنامه نویس هم خود شما هستین. تا SUBVERSION یا CVS حتما از.

پ

.ن. در صورتی که هر گونه سوال یا بحثی در مورد مطالب با دارید می تونید اون را در قسمت انجمن سایت مطرح کنید.

استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس

http://www.iranphp.net

1

عنوان مقاله

: استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس

نگارنده

: سید حمید رضا هاشمی گلپایگانی

hamid@morva.net

تاریخ نگارش

: آدرس پست الکترونیک: دوشنبه ۴ آذرماه ١٣٨١

http://www.iranphp.net

2

استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس

برای دریافت توابع کافیست که کد توابع را از این آدرس دریافت کنید

:

http://www.iranphp.net/modules/sections/index.php?op=viewarticle&artid=19

ذخیره کنید

برای اینکه بتوانید از این توابع در برنامه خود استفاده کنید کافیست در ابتدای برنامه خود دستور زیر را وارد کنید

. jalali.php متن این توابع را درون یک فایل جدید بنام به عنوان مثال Paste و Copy بوسیله یک:

<?

require_once

?>

php"jalali.php";

در اختیار شما قرار می گیرند که به ترتیب بر ای تبد یل

تاریخ میلادی به شمسی و شمسی به میلادی مورد استفاده قرار می گیرند

jalali_to_gregorian و gregorian_to_jalali با این کار دو تابع با نامهای.

برای اینکه بتوانم نحوه استفاده از این دو تابع را شرح دهم به ذکر مثالهایی در این مورد می پردازم

.

١

-تبدیل تاریخ میلادی به شمسی :

استفاده کنید

که همگی از نوع عددی می باشند

. این تابع ٣ متغیر را از ورودی دریافت می کند که به ترتیب سال، ماه و روز می باشد gregorian_to_jalali برای این کار باید از تابع.

٢٥

را که درون یک متغیر داریم به شمسی تبدیل کنیم و سپس آنرا درون یک متغیر قرار دهیم ابتدا باید عناصر تار یخ -١١- برای مثال اگر بخواهیم تاریخ ٢٠٠٢

میلادی رو جدا کنیم

. برای این کار می توانیم در دستور زیر استفاده کنیم:

<?

$gdate

php='2002-11-25';

list

?>

( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );

syntax

می باشد که چون م ی توان به صورت

قرار گیرد و متغیر دوم هم که همان متغییری است که تاریخ میلادی ما در آن قرار دارد

توسط جداکننده استفاده کرده ایم . همانطور که می بینید $gdate برای جدا کردن عناصر تاریخ preg_spilit در اینجا از دستورdelimiter این دستور به این صورت است که 2 متغیر به عنوان ورودی دریافت می کند . اولی به عنوانslash (/) نیز آنرا وارد کرد باید بین دو regex

استفاده کرده ایم تا عناصر آرایه را هر کدام در یک متغیر قرار دهیم

استفاده کنیم

. هم اکنون روز، ماه و سال list چون خروجی این دستور یک آرایه است از دستور: gregorian_to_jalali میلادی را هر کدام در یک متغیر داریم . حال می توانیم از تابع

<?

php

list

?>

( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);

وارد کرده ایم و چون خروجی

این تابع از نوع آرایه است

هر کدام از عناصر این آرایه را در یک متغیر قرار می دهیم

باشند

grogorian_to_jalali در اینجا مشخص است که ٣ متغیر سال، ماه و روز میلادی را به عنوان متغیر های ورودی تابع. این متغیر های حاوی اطلاعات سال، ماه و روز همان تاریخ به شمسی می list توسط دستور. برای اینکه آنها را به صورت قابل نمایش در یک متغیر قرار دهیم می توانیم این خط را به برنامه اضافه کنیم:

<?

$jdate

?>

php= $jyear."/".$jmonth."/".$jday;

را نمایش دهید همان تاریخ از نوع شمسی خواهد بود که چیزی شبیه به مقدار زیر است

: $jdate در صوتیکه مقدار

١٣٨١

/٩/٤

http://www.iranphp.net

3

حال در صورتیکه بخواهید تاریخ همین لحظه را به صورت شمسی بدست آورید می توانید از برنامه زیر استفاده کنید

:

<?

php

list

($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d"));

list

( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);

$jdate

?>

= $jyear."/".$jmonth."/".$jday;

با آرگومان داده شده تاریخ فعلی سیستم استخراج می شود و در همان روال توضیح داده شده تبدیل به شمسی

قرار می گیرد

برای اینکه کارتان کمی ساده تر شود می توانید تابعی به شکل زیر تعریف کنید

date همانطور که ملاحظه کردید از دستور$jdate شده و در متغیر:

<?

php

function

{

get_jalali_date( $gdate='now' )

if

{

( $gdate == 'now' )

list

}

($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d"));

else

{

list

}

( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );

list

( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);

return

}

?>

$jyear."/".$jmonth."/".$jday;

تعریف کردیم که یک متغیر به عنوان ورودی دریافت می کند که این همان تاریخ به میلادی است

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

ولی اگر هیچ متغیری به عنوان ورودی به این تابع ندهید، تاریخ همان لحظه را به شمسی برای شما در خروجی بر می گرداند

. در صوتیکه هنگام get_jalali_date تابعی با نام

٢٥

به شمسی و قرار دادن آن در یک متغیر می توانیم با استفاده از تابع بالا اینگونه عمل کنیم -١١- مثلا برای تبدیل همان تاریخ ٢٠٠٢

<?

$jdate

?>

php= get_jalali_date("2002-11-25");

و یا برای بدست آوردن تاریخ همین لحظه و قرار دادن آن در یک متغیر اینگونه عمل می کنیم

:

<?

$jdate

?>

php= get_jalali_date();

همانطور که می بینید کار بسیار ساده تر شد

.

١

-تبدیل تاریخ شمسی به میلادی :

استفاده کنید

که عبارتند از سال، ماه و روز که همگی به شمسی هستند

گرداند

. مانند تابع قبل این تابع هم سه متغیر به عنوان ورودی دریافت می کند jalali_to_gregorian با توضیحاتی مشابه می توانید از تابع. سپس در جواب آرایه ای شامل سه قسمت که سال، ماه و روز میلادی همان تاریخ هستند را بر می.

١٣٨١ را به میلادی تبدیل کنیم کاری مشابه برنامه زیر انجام می دهیم

: /٩/ برای نمونه اگر بخواهیم تاریخ ٤

http://www.iranphp.net

4

<?

$jdate

php="1381/9/4";

list

( $jyear, $jmonth, $jday ) = preg_split ( '/\//', $jdate );

list

( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, $jday);

$gdate

?>

= $gyear."-".$gmonth."-".$gday;

آرگومان اول خود که همان

می گیرد که باید بین دو علامت

preg_split تنها تفاومت موجود با تابع بالا استفاده از / برای جداسازی اجزاء تاریخ شمسی می باشد . همانطور که گفتیم تابع/ باشد ، regex جدا کننده ) می باشد را به صورت )delimiter

قرار می دهیم که جداکننده مشخص باشد

بساز یم که کار را

راحتتر کند

با آرزوی توفیقات الهی

. \ (back slash ) ما می باشد یک delimiter در اینجا باید قبل / که نشان دهنده کاراکترget_gregorian_date توضیح خاص دیگری هم ندارد و همانند تابع تبدیل میلادی به شمسی اینجا هم می توانیم تابعی با نام. ایجاد این تابع را به خواننده واگذار می کنم