تابع نگو هلو بگو
در برنامه نويسي وب، گاهي لازم داريم که يک URL رو پردازش کنيم. مثلا از يه URL طولاني، domainاش رو بگيريم يا فقط آدرس صفحه اش رو بدست بياريم يا کوئريش رو بخونيم.
براي چنين کارايي برنامه نويسهاي ناآگاه سراغ Regular Expression ميرند در حاليکه PHP عزيز براي اين کار تابع داره که با هلويي هرچه تمامتر حتي fragment يا hash آدرس رو هم ميده.
تابع parse_url در حالت استاندارد يک URL ميگيره و آرايه اي حاوي اجزاي آدرس ميده شامل اين قسمتها:
- scheme: همون http يا https يا ftp و غيره
- host: دامنه اصلي مثل Boplo.ir
- port: پورت اگر باشه
- user: همون username اگر باشه
- pass: رمز يا password اگر ست شده باشه
- path: مسير آدرس بعد از دامين
- query: کوئري يعني کاراکترهاي بعد از علامت "?"
- fragment: يا hash يا کاراکترهايي که بعد از علامت "#" ميان
براي نمونه همون مثالي که خود PHP مطرح کرده:
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
/**
* Output:
* Array
* (
* [scheme] => http
* [host] => hostname
* [user] => username
* [pass] => password
* [path] => /path
* [query] => arg=value
* [fragment] => anchor
* )
*/
نکته مهم اين تابع اينه وقتي بجاي URL چرنديات تحويلش بديم، مقدار FALSE برميگردونه که ما بايد چک کنيم ولي بخاطر اينکه بيخود وقتش رو گرفتيم،
يک خطاي E_WARNING هم صادر ميکنه که اگر نمايش اين دسته خطاها فعال باشه، خطا ميگيرم که مي تونيم اين مشکل رو با @ حل کنيم:
if( $url = @parse_url("chetoty googooli?") ) {
echo "Host: " . $url['host'];
} else {
echo "Invalid URL entered!";
}
از نسخه 5.1.2 به اين تابع يک پارامتر دوم اضافه شده که ميشه باهاش بجاي اينکه آرايه بگيريم، فقط بخش مورد نظر رو بصورت String بگيريم. مثلا اگر ميخوايم فقط کوئري آدرس رو بگيريم پارامتر دوم رو برابر PHP_URL_QUERY قرار ميديم. نمونه:
$url = "http://boplo.ir/?loveBoplo=absolutely&loveAmirHossein=dige_poroo_nasho
echo parse_url($url, PHP_URL_QUERY);
/**
* Output:
* loveBoplo=absolutely&loveAmirHossein=dige_poroo_nasho
*/
واسه اينکه موضوع کامل بشه، وقتي به کوئري يک تابع نياز داريم، معمولا اينکه مقدار هر کليد در اون کوئري چيه به درد ميخوره. پردازش کوئري کار خيلي ساده ايه ولي براي همون کار ساده ي چند خطي هم تابعي وجود داره به نام parse_str. مثلا براي پردازش کوئري مثال قبل، اينجوري لذت ميبريم:
$url = "http://boplo.ir/?loveBoplo=absolutely&loveAmirHossein=dige_poroo_nasho
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $array);
print_r($array);
/**
* Output:
* Array
* (
* [loveBoplo] => absolutely
* [loveAmirHossein] => dige_poroo_nasho
* )
*/
از PHP لذت ببريم.
برچسب ها: function
بیرون کشیدن لیست Enum و Set از دیتابیس
یکی از روشهای ذخیره اطلاعات در MySQL استفاده از لیست از قبل تعیین شده است که کنترل کنیم فقط کلمات خاصی قابل ذخیره و بازیابی باشند. مثلا جدول زیر:
CREATE TABLE boplo_categories (
`id` INT(10) AUTO_INCREMENT PRIMARY_KEY,
`categories` ENUM('PHP', 'Web Design', 'MODx', 'IT', 'Scratch'),
`tags` SET('Solution', 'API', 'AJAX', 'CSS', 'Javascript')
)
در این جدول، ستون categories که از نوع ENUM تعیین شده، حتما با یکی از مقادیر مشخص شده می تونه پر بشه.
و ستون tags که از نوع SET ایجاد شده مانند ENUM عمل می کنه با این تفاوت که در این ستون میشه بیشتر از یکی از موارد لیست رو ثبت کرد مثلا هم CSS و هم Solution ولی ENUM فقط یک مقدار میتونه داشته باشه.
کار با ENUM و SET خیلی لذتبخشه غیر از موقعی که بخوایم لیستی که در ENUM یا SET مشخص شده رو در برنامه امون داشته باشیم. معمولترین کاردبردش ساختن <SELECT> براساس مقادیر مشخص شده است. برای اینکار باید ابتدا لیست مقادیری که بصورت ENUM یا SET مشخص شده رو توسط یک کوئری بدست بیاریم و سپس کلمات لیست رو از این مقدار خارج کنیم. در ادامه پست میخوایم لیست کلمات مشخص شده برای ستون categories که بالا قرار دادم رو بدست بیاریم.
برچسب ها: function,mysql,solution
شیوه نامتعارفی برای نمایش زمان
یه روش نمایش زمان، مدل چند وقت پیشه که مثلا بجای فلان زمان بنویسیم: 23 روز و 19 ساعت و 45 دقیقه پیش.
تابع زیر همین کار رو می کنه. تاریخ Timestamp میگیره و مدل "چند وقت پیش" تحویل میده. میشه توسط پارامترهاش تعیین کنیم که از سال تا ثانیه چه واحدهایی رو نمایش بده. یعنی مثلا سال و ماه و روز رو فقط نشون بده یا مثلا دقیقه و ثانیه رو نمایش نده و ....
نمونه:
$time = time() - 15*60;
echo getPastTime($time);
خروجی این خواهد بود:
15 دقیقه پیش
/**
* getPastTime : Get Past Time in String
*
*
* Author : AHHP(Amir Hossein Hodjaty Pour) ~ Boplo@Boplo.ir
* License : GPL
* Version : 1
* Created on : 1388/11/20 11:55 pm
*
* @param integer $time Unix Timestamp to parse
* @param bool $year Set to FALSE to remove Year from output. optional default to TRUE.
* @param bool $month Set to FALSE to remove Month from output. optional default to TRUE.
* @param bool $day Set to FALSE to remove Day from output. optional default to TRUE.
* @param bool $hour Set to FALSE to remove Hour from output. optional default to TRUE.
* @param bool $minute Set to FALSE to remove Minute from output. optional default to TRUE.
* @param bool $second Set to TRUE to remove Second from output. optional default to FALSE.
* @return string Formatted string
*/
function getPastTime($time, $year=true, $month=true, $day=true, $hour=true, $minute=true, $second=false) { }
برچسب ها: date,function,solution
یک تابع جمع و جور
همونطور که از عنوان مشخصه، یه تابع ساده برای inject یا تزریق مقدار در یک آرایه.
/**
* Injects input to array
*
* @param array $array Original array
* @param integer $index Index to inject into
* @param mixed $input Mixed input to be injected
* @return array New array
*/
function array_inject($array, $index, $input) {
$start = array_slice($array, 0, $index);
$inject = is_array($input) ? $input : array($input);
$end = array_slice($array, $index);
return array_merge($start, $inject, $end);
}
// Example
print_r(array_inject($arr, 2, $arr));
print_r(array_inject($arr, 2, 'an input'));
برچسب ها: array,function,solution
تبدیل خرچنگ قورباغه به آدم خوش تیپ
بازگردوندن کاراکترهای ISO-Western به فارسی یا تبدیل "Ø§Ù…ÛŒØ±ØØ³ÛŒÙ†" به "امیرحسین"
امیرحسین (اینجانب) عضو تیم پشتیبانی فارسی مادایکس به آدرس http://MODxCMS.ir هستم. خیلی وقت پیش یه کرم اینترنتی پخش شد که به محتوای فایلها، کدهای تخریبی اضافه می کرد که دامن این سایت رو گرفت و ما هم اومدیم درستش کنیم زدیم جفت چشماش رو کور کردیم و محتوای کل دیتابیس بصورت Western اینکد (Encode) شد (مثلا به این شکل: "Ø§Ù…ÛŒØ±ØØ³ÛŒÙ†") و دیگه تاریخ پیوست.
تا اینکه چند وقت پیش یکی از اعضای فروم سایت زحمت کشیدند و فایلهای سایت از جمله بخش آموزش رو که قبلا ذخیره کرده بودند رو مرتب کردند، به من دادند تا توی سایت بذارم.
قصه کافیه، من یه تابع PHP نوشتم که این کاراکترها رو به فارسی برمیگردونه. این تابع، این کاراکترهای کج و کوله رو به عنوان پارامتر میگیره و فارسی روان تحویل میده.
از این که بگذریم، من در حین تست این تابع یه روش دیگه برای برگردوندن این کاراکترها پیدا کردم که راستش خیلی ساده تر از این تابع است.
کافیه یه Notepad باز کنیم و این کاراکترها رو توش کپی کنیم بعد از ذخیره، وقتی دوباره این فایل رو باز کنیم، چی میبینیم؟ فارسی!
نظرت چیه؟
برچسب ها: function,Persian,solution
مرتب کردن براساس الفبای فارسی
توی برنامه نویسی پیش میاد که بخوایم یه سری اطلاعات فارسی رو براساس الفبای فارسی مرتب کنیم. من می دونستم که PHP با فارسی میونه خوبی نداره ولی نمی دونستم چقدر. فکر می کردم mbstring یا iconv این مشکلات رو حل کردند ولی تازه فهمیدم اشتباه فکر می کردم که PHP با فارسی (یونیکد) میونه خوبی نداره در واقع اصلا میونه ای بینشون نیست که بخواد خوب یا بد باشه!
در PHP6 ظاهرا قراره یه کارایی انجام بدن که تو سرشون بخوره! همین الان خیلی از هاستینگها حاضر نیستند PHP5 نصب کنند، PHP6 برای End-user ایرانی شیرین حواله 10 ساله دیگه است!
اخیرا به یک مبحثی در رابطه با Sort کردن سطرهای MySQL برخوردم. خواستم این مشکل رو با خود MySQL حل کنم، دیدم حدود یک میلیارد حلقه و کوئری MySQL نیاز داره تازه نیاز به تجسم این یک میلیارد عملیات داشت که از ظرفیت ذهن اینجانب خارج می باشد.
دنبال راه حل جدید میگشتم که ذهنم رفت سراغ توابع دقیق Sorting برای الفبای انگلیسی. گفتم اینا تو بلاد کفر به چه راحتی Sort می کنند خوب بیام یه جوری الفبای فارسی رو با الفبای انگلیسی متناظر کنم و ترتیب رو ازش خارج کنم (اگه متوجه شدی، زود بگو چی گفتم؟! چون خودم دقیق نفهمیدم!)
خلاصه، یه تابع به نام psort نوشتم که آرایه میگیره و براساس الفبای فارسی مرتب می کنه. به این صورت که اول اعداد فارسی، بعد حروف فارسی و بعد اعداد و حروف انگلیسی....حسن این تابع به توابع خود PHP اینه که شما می تونید ترتیب الفبا رو هر جور دوست دارید تغییر بدید مثلا همزه رو اول یا آخر الفبا قرار بدید و غیره و ذالک.
array psort($input_arr [, $function="asort"])
باقی ماجرا....
برچسب ها: array,function,Persian,psort,solution,Sort
YADC) Yet Another Date Converter)
چی؟ date؟ .نه، نه، اینجا دنبال قرار ملاقات و اینجور حرکتها نباش
اینجا منظور از date، تابع ()date توی زبان PHP هست!
من با مقداری تلاش، تابع ()date رو با همه کاراکترهای فرمتش، بصورت شمسی در آوردم تا بتونید توی اسکریپتهات به زیبایی تابع date رو بر اساس تقویم جلالی استفاده کنی.
کلی توضیح و تفسیر داریم که تو دنباله مطلب بخون و همونجا داونلود کن.
برچسب ها: date,function,jdate,solution,جلالی,شمسی,مبدل تاریخ
< قبلیبعدی >