برای یادگیری یک زبان برنامه نویسی بهترین راه انجام پروژه های عملی و کاربردی است. با انجام تمرین شما با ساختار یک زبان آشنا می شوید. از حلقه ها ، عبارات شرطی و عبارات منطقی استفاده می کنید. متغیرها و آرایه ها را به کار می گیرید و در هنگام بروز خطا و ارورها برای راه حل در گوگل جستجو کرده و به دانش و مهارت خود می افزایید.
در این پست و پست بعدی ۳۲ تمرین PHP را از سایت Codewars.com با هم مرور می کنیم. Codewars.com یکی از سایت های تمرین برنامه نویسی است که می توانید با انتخاب زبان برنامه نویسی خود تمرینات آن را انجام دهید.
برای اجرای برنامه های php باید از یک سرور که php روی آن نصب است استفاده کنیم و از آنجا که هدف ما فعلاً تمرین است و نیازی به هزینه جهت سرور واقعی نداریم ، می توانیم یک سرور مجازی روی کامپیوتر خود راه اندازی کرده و برنامه های php را روی آن Run نماییم.
اگر از سیستم عامل ویندوز استفاده می کنید می توانید برنامه XAMPP را نصب کرده و اگر از لینوکس استفاده می کنید LAMP را نصب نمایید.
برای معرفی توابع از سایت w3schools.com استفاده شده است.
قبل از حل تمرینات زیر آموزش PHP را مطالعه نمایید:
۱. تابعی بنویسید که یک عدد را بگیرد و کاراکتر ASCII مربوطه را برای آن مقدار برگرداند.
مثال: get_char(65) # => ‘A’
پاسخ:
php یک تابع آماده برای این کار دارد و نیازی به نوشتن تابع جدید نیست.
تابع ()chr یک عدد بین ۰ و ۲۵۵ به عنوان ورودی می گیرد و کاراکتر اسکی متناظر آن را بر می گرداند:
<?php
echo chr(75);

K
دستور echo در php برای چاپ خروجی است.
۲. این کد به درستی اجرا نمی شود. سعی کنید دلیل آن را پیدا کنید.
<?php
function multiply($a, $b) {
$a * $b;
}
پاسخ:
تابع بالا با نام ()multiply قرار است دو عدد را به عنوان ورودی گرفته و حاصلضرب را برگرداند ولی از return استفاده نکرده است. شکل صحیح تابع به صورت زیر است:
<?php
function multiply($a, $b) {
return $a * $b;
}
echo multiply(75,4);

300
۳. تابعی بنویسید که دو تاریخ را گرفته و اختلاف آنها را برگرداند.
توضیحات: تابع ما سه پارامتر خواهد داشت:
- last : تاریخ قدیمی تر
- today : تاریخ جدید تر
- cycleLength : یک عدد صحیح که اختلاف دو تاریخ بالا با آن مقایسه می شود.
تابع ما باید روزهای سپری شده از last تا today را محاسبه کرده و با cycleLength مقایسه کند.
پاسخ: تابع ()periodIsLate را به صورت زیر می نویسیم:
<?php
function periodIsLate($last, $today, $cycleLength)
{
$aaa=date_create($last);
$bbb=date_create($today);
$mmm=date_diff($aaa, $bbb) ->days;
if ($mmm>$cycleLength){
return 1;
}
echo(periodIsLate("2017-07-18", "2017-07-11", 5));
فرم خلاصه شده تابع بالا:
<?php
function periodIsLate($last, $today, $cycleLength)
{
return ((date_diff(date_create($today), date_create($last))->days) > $cycleLength);
}
echo(periodIsLate("2017-07-18", "2017-07-11", 5));

1
در خط 11 مقادیر رشته ای “18-07-2017” و “11-07-2017” را به عنوان پارامترهای اول و دوم تابع پاس می دهیم. همچنین عدد 5 را به عنوان پارامتر سوم پاس می دهیم.
در خط 3 و 4 تابع ()date_create رشته های بالا را به شیء جدید DateTime تبدیل کرده و در متغیرهای aaa$ و bbb$ ذخیره می شوند.
در خط 5 تابع ()date_diff دو شیء aaa$ و bbb$ را با هم مقایسه کرده و اختلاف را به روز در متغیر mmm$ ذخیره می کند.
در خط 7 اگر مقدار متغیر mmm$ بزرگتر از cycleLength ( پارامتر سوم تابع اصلی ) بود مقدار 1 به خروجی تابع می رود.
در تابع ()periodIsLate که خودمان نوشتیم از دو تابع ()date_create و ()date_diff را که از توابع php هستند استفاده کردیم که در ادامه آنها را معرفی می کنیم:
معرفی تابع ()date_create :
تابع date_create() یک شیء جدید DateTime ایجاد می کند.
سینتکس:
date_create(time,timezone);
مثال:
<?php
$date=date_create("2013-03-15");
echo date_format($date,"Y/m/d");

2013/03/15
تابع date_format خروجی را به فرمت مورد نظر ما تولید می کند.
مقادیر پارامتر :
پارامتر | توضیحات |
time | اختیاری. رشته تاریخ/زمان را مشخص می کند. NULL زمان فعلی را نشان می دهد |
timezone | اختیاری. منطقه زمانی را مشخص می کند. پیش فرض منطقه زمانی فعلی است. |
مثال:
<?php
echo "<pre>",
print_r(date_create("2017-07-13"));
echo "</pre>";
خروجی:

DateTime Object
(
[date] => 2017-07-13 00:00:00.000000
[timezone_type] => 3
[timezone] => Europe/Berlin
)
1
بجای echo از ()print_r استفاده کردیم تا بتوانیم خروجی آبجکت را داشته باشیم.
معرفی تابع ()date_diff :
تابع ()date_diff اختلاف بین دو شیء DateTime را برمی گرداند.
سینتکس:
date_diff(datetime1, datetime2, absolute)
مثال:
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");

+272 days
ابتدا با استفاده از تابع date_create یک رشته را به یک شیء DateTime تبدیل کردیم ، سپس با استفاده از تابع date_diff اختلاف دو تاریخ را برگرداندیم.
مقادیر پارامتر :
پارامتر | توضیحات |
datetime1 | اجباری. یک شیء DateTime |
datetime2 | اجباری. یک شیء DateTime |
absolute | اختیاری. یک مقدار دودویی. TRUE یعنی مقدار اختلاف باید مثبت باشد. پیش فرض = FALSE |
مثال:
<?php
echo "<pre>",
print_r(date_diff(date_create("2017-07-18"), date_create("2017-07-11")));
echo "</pre>";
خروجی:
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 7
[h] => 0
[i] => 0
[s] => 0
[f] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 7
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
1
در مثال بالا دیدیم که تابع ()date_diff یک آبجکت یا شیء به ما برمی گرداند که حاوی اطلاعات زیادی است. ولی هدف ما از اجرای ()date_diff در خط هفتم تابع ()periodIsLate دسترسی به اختلاف دو تاریخ به روز است. پس از days<- استفاده کردیم که از آبجکت فوق تعداد اختلاف روز را به ما بر می گرداند.
۴. تمام علامت های تعجب را از انتهای جمله حذف کنید.
مثال:
remove("Hi!") === "Hi"
remove("Hi!!!") === "Hi"
remove("!Hi") === "!Hi"
remove("!Hi!") === "!Hi"
remove("Hi! Hi!") === "Hi! Hi"
remove("Hi") === "Hi"
پاسخ: تابع ()remove را به صورت زیر می نویسیم:
<?php
function remove($s)
{
return rtrim($s, '!');
}
echo (remove("!hello!!!!"));

hello!
معرفی تابع ()rtrim :
سینتکس:
rtrim(string,charlist)
مثال:
<?php
$str = "Hello World!";
echo $str . "<br>";
echo rtrim($str,"World!");

Hello World!
Hello
مقادیر پارامتر :
پارامتر | توضیحات |
string |
ضروری. رشته مورد بررسی را مشخص می کند
|
charlist |
اختیاری. مشخص می کند کدام کاراکترها از رشته حذف شوند. در صورت حذف، تمام کاراکترهای زیر حذف می شوند:
|
تابع ()ltrim عملکردی مشابه تابع ()rtrim دارد.
۵. تبدیل عدد به آرایه اعداد معکوس
348597 => [7,9,5,8,4,3]
0 => [0]
پاسخ:
در این تمرین تابع ()digitize را نوشته و در آن از دوتابع ()array_reverse و ()str_split استفاده کرده ایم:
<?php
function digitize($c)
{
return array_reverse(str_split($c));
}
echo "<pre>";
print_r(digitize("68457"));
echo "</pre>";

Array
(
[0] => 7
[1] => 5
[2] => 4
[3] => 8
[4] => 6
)
تابع ()array_reverse یک آرایه را به ترتیب معکوس برمی گرداند.
معرفی تابع ()str_split :
str_split(string,length)
مثال:
<?php
echo "<pre>";
print_r(str_split("Hello"));
echo "</pre>";

Array
(
[0] => H
[1] => e
[2] => l
[3] => l
[4] => o
)
مقادیر پارامتر :
پارامتر | توضیحات |
string |
ضروری. رشته ای را برای تقسیم مشخص می کند
|
length |
اختیاری. طول هر عنصر آرایه را مشخص می کند. پیش فرض 1 است
|
معرفی تابع ()array_reverse :
تابع ()array_reverse یک آرایه را به ترتیب معکوس برمی گرداند.
سینتکس:
array_reverse(array, preserve)
مثال:
<?php
$a=array("a"=>"Volvo","b"=>"BMW","c"=>"Toyota");
echo "<pre>";
print_r(array_reverse($a));
echo "</pre>";

Array
(
[c] => Toyota
[b] => BMW
[a] => Volvo
)
مقادیر پارامتر :
پارامتر | توضیحات |
array |
ضروری. یک آرایه را مشخص می کند
|
preserve |
اختیاری – مشخص می کند که آیا تابع باید کلیدهای آرایه را حفظ کند یا خیر. مقادیر ممکن:
|
۶. برنامه ای بنویسید که یک عدد را به عنوان ورودی گرفته و مجموع اعداد از ۱ تا آن عدد را پیدا کند. عدد همیشه یک عدد صحیح مثبت بزرگتر از صفر خواهد بود.
مثال:
summation(2) -> 3
1 + 2
summation(8) -> 36
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
پاسخ:
مسئله را به دو روش متفاوت حل می کنیم. در روش اول از روابط ساده ریاضی استفاده می کنیم و در روش دوم از توابع php استفاده می کنیم.
روش اول:
<?php
function summation($c)
{
return ($c * ($c + 1) / 2);
}
echo summation(8);

36
روش دوم:
<?php
function summation($c)
{
return array_sum(range(1, $c));
}
echo summation(8);

36
معرفی تابع ()range :
- تابع ()range یک آرایه حاوی محدوده ای از عناصر ایجاد می کند.
- این تابع آرایه ای از عناصر را از کم به زیاد برمی گرداند.
range(low, high, step)
مثال:
<?php
$number = range(0,5);
echo "<pre>";
print_r ($number);
echo "</pre>";

Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
)
مقادیر پارامتر :
پارامتر | توضیحات |
low |
ضروری. کمترین مقدار آرایه را مشخص می کند
|
high |
ضروری. بالاترین مقدار آرایه را مشخص می کند
|
step |
اختیاری. افزایش استفاده شده در محدوده را مشخص می کند. پیش فرض 1 است
|
معرفی تابع ()array_sum :
array_sum(array)
مثال:
<?php
$a=array(5,15,25);
echo array_sum($a);

45
مقادیر پارامتر :
پارامتر | توضیحات |
array |
ضروری. یک آرایه را مشخص می کند
|
۷. برنامه ای بنویسید که یک عدد صحیح از ۱ تا ۱۲ را به عنوان ورودی گرفته و مشخص نماید که به کدام فصل سال تعلق دارد. به عنوان مثال ماه ۲ (اردیبهشت) بخشی از سه ماهه اول و ماه ۶ (شهریور) بخشی از سه ماهه دوم سال است.
پاسخ:
مسئله را به دو روش متفاوت حل می کنیم. در روش اول از if و عملگر or استفاده می کنیم و در روش دوم از تابع ()ceil استفاده می کنیم.
روش اول:
<?php
function quarterOf($month)
{
if ($month == 1 || $month == 2 || $month == 3) {
return 1;
}
if ($month == 4 || $month == 5 || $month == 6) {
return 2;
}
if ($month == 7 || $month == 8 || $month == 9) {
return 3;
}
if ($month == 10 || $month == 11 || $month == 12) {
return 4;
} else {
return "enter 1-12";
}
}
echo quarterOf(7);

3
روش دوم:
<?php
function quarterOf($month)
{
return ceil($month / 3);
}
echo quarterOf(7);

3
معرفی تابع ()ceil :
ceil(number);
مثال:
<?php
echo(ceil(0.60) . "<br>");
echo(ceil(0.40) . "<br>");
echo(ceil(5) . "<br>");
echo(ceil(5.1) . "<br>");
echo(ceil(-5.1) . "<br>");
echo(ceil(-5.9));

1
1
5
6
-5
-5
مقادیر پارامتر :
پارامتر | توضیحات |
number |
ضروری. مقدار را برای گرد کردن مشخص می کند |
۸. تابعی بنویسید که چهار عمل اصلی ریاضی را انجام دهد.
توضیحات:
تابع باید سه پارامتر داشته باشد :
- عملیات (رشته/char)
- value1 (عدد)
- value2 (عدد)
تابع باید نتیجه اعداد را پس از اعمال عملیات انتخاب شده برگرداند.
مثال:
('+', 4, 7) --> 11
('-', 15, 18) --> -3
('*', 5, 5) --> 25
('/', 49, 7) --> 7
پاسخ:
<?php
function basicOp($op, $val1, $val2)
{
switch ($op) {
case "+":
return $val1 + $val2;
case "-":
return $val1 - $val2;
case "*":
return $val1 * $val2;
case "/":
return $val1 / $val2;
default:
return "no match operator";
}
}
echo basicOp('*', 4, 7);

28
معرفی دستور switch() case :
دستور switch برای انجام اقدامات مختلف بر اساس شرایط مختلف استفاده می شود. از دستور switch برای انتخاب یکی از چندین بلوک کد برای اجرا استفاده کنید.
سینتکس:
switch (n) {
case label1:
code to be executed if n=label1;
break;
case label2:
code to be executed if n=label2;
break;
case label3:
code to be executed if n=label3;
break;
...
default:
code to be executed if n is different from all labels;
}
کار به این صورت است: ابتدا یک عبارت n داریم (اغلب یک متغیر)، که یک بار ارزیابی می شود. سپس مقدار عبارت با مقادیر هر مورد در ساختار مقایسه می شود. اگر مطابقت وجود داشته باشد، بلوک کد مرتبط با آن مورد اجرا می شود. برای جلوگیری از اجرای خودکار کد در مورد بعدی از break استفاده کنید. اگر مطابقت پیدا نشود از عبارت پیش فرض default استفاده می شود.
۹. یک تابع با دو آرگومان ایجاد کنید که آرایه ای از اولین (n) مضرب های (x) را برمی گرداند.
فرض کنید هم عدد داده شده و هم تعداد دفعات شمارش اعداد مثبت بزرگتر از 0 باشند. نتایج را به صورت یک آرایه برگردانید.
مثال:
countBy(1,10) // should return [1,2,3,4,5,6,7,8,9,10]
countBy(2,5) // should return [2,4,6,8,10]
پاسخ:
مسئله را به دو روش متفاوت حل می کنیم. در روش اول از حلقه for و در روش دوم از تابع ()range استفاده می کنیم.
روش اول:
<?php
function countBy($x, $n)
{
for ($i = 0; $i < $n; $i++) {
$result[$i] = ($i + 1) * $x;
}
return $result;
}
echo "<pre>";
print_r(countBy(2, 5));
echo "</pre>";

Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
روش دوم:
<?php
function countBy($x, $n)
{
return range($x, $n * $x, $x);
}
echo "<pre>";
print_r(countBy(2, 5));
echo "</pre>";

Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
تابع ()range از توابع php است که در تمرینات قبلی معرفی گردید.
۱۰. h ساعت، m دقیقه و s ثانیه بعد از نیمه شب را نشان می دهد.
تابعی بنویسید که زمان از نیمه شب را بر حسب میلی ثانیه برمی گرداند.
مثال:
h = 0
m = 1
s = 1
result = 61000
محدودیت های ورودی:
0 <= h <= 23
0 <= m <= 59
0 <= s <= 59
پاسخ:
<?php
function past($h, $m, $s)
{
return (($h * 60 * 60) + $m * 60 + $s) * 1000;
}
echo(past(2, 8, 20));
خروجی:

7700000
۱۱. تابعی بنویسید که یک پارامتر رشته را می پذیرد و هر کلمه را در رشته معکوس می کند. تمام فضاهای رشته باید حفظ شود.
مثال:
"This is an example!" ==> "sihT si na !elpmaxe"
"double spaces" ==> "elbuod secaps"
پاسخ:
<?php
function reverse($c): string
{
return implode(' ', array_reverse(explode(' ', strrev($c)))) ;
}
}
echo reverse("ehT kciuq nworb xof spmuj revo eht yzal .god");
خروجی:

The quick brown fox jumps over the lazy dog.
در تمرین بالا از سه تابع زیر استفاده کرده ایم:
- تابع ()strrev یک متن را برعکس می کند.
- تابع ()explode یک متن را به تکه کوچکتر تر به شکل یک آرایه تبدیل می کند.
- تابع ()array_reverse یک آرایه را برعکس میکند.
- تابع ()implode یک رشته را از عناصر یک آرایه برمی گرداند.
معرفی تابع ()strrev :
تابع ()strrev یک رشته را معکوس می کند.
سینتکس:
strrev(string)
مثال:
<?php
echo strrev("Hello World!");

!dlroW olleH
مقادیر پارامتر :
پارامتر | توضیحات |
string |
ضروری. رشته معکوس را مشخص می کند
|
معرفی تابع ()explode :
تابع ()explode یک رشته را به یک آرایه می شکند.
توجه: پارامتر “separator” نمی تواند یک رشته خالی باشد.
توجه: این تابع binary-safe است.
در PHP، برخی از توابع به عنوان توابع binary-safe علامت گذاری شده اند. این بدان معنی است که توابع به درستی کار می کنند حتی زمانی که داده های باینری را ارسال می کنید.
سینتکس:
explode(separator,string,limit)
مثال:
<?php
$str = "Hello world. It's a beautiful day.";
echo "<pre>";
print_r (explode(" ",$str));
echo "</pre>";

Array
(
[0] => Hello
[1] => world.
[2] => It's
[3] => a
[4] => beautiful
[5] => day.
)
مقادیر پارامتر :
پارامتر | توضیحات |
separator |
ضروری. محل شکستن رشته را مشخص می کند
|
string |
ضروری. رشته برای شکافتن
|
limit |
اختیاری. تعداد عناصر آرایه برای بازگشت را مشخص می کند.
|
معرفی تابع ()implude :
تابع ()implode یک رشته را از عناصر یک آرایه برمی گرداند.
توجه: تابع ()implode پارامترهای خود را به هر ترتیب می پذیرد. با این حال، برای سازگاری با ()explode، باید از ترتیب مستند آرگومان ها استفاده کنید.
توجه: پارامتر جداکننده ()implode اختیاری است. با این حال، توصیه می شود همیشه از دو پارامتر برای سازگاری با عقب استفاده کنید.
توجه: این تابع binary-safe است.
در PHP، برخی از توابع به عنوان توابع binary-safe علامت گذاری شده اند. این بدان معنی است که توابع به درستی کار می کنند حتی زمانی که داده های باینری را ارسال می کنید.
سینتکس:
implode(separator,array)
مثال:
<?php
$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr)

Hello World! Beautiful Day!
مقادیر پارامتر :
پارامتر | توضیحات |
separator |
اختیاری. مشخص می کند که چه چیزی بین عناصر آرایه قرار گیرد. پیش فرض “” است (یک رشته خالی)
|
array |
ضروری. آرایه ای برای پیوستن به یک رشته
|