۳۲ تمرین PHP قسمت اول

  • May 31, 2022 7:35 pm

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

     در این پست و پست بعدی ۳۲ تمرین 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);
flesh

K

      دستور echo در php برای چاپ خروجی است.

۲. این کد به درستی اجرا نمی شود. سعی کنید دلیل آن را پیدا کنید.

<?php

function multiply($a, $b) {
     $a * $b; 
}

پاسخ:

      تابع بالا با نام ()multiply قرار است دو عدد را به عنوان ورودی گرفته و حاصلضرب را برگرداند ولی از return استفاده نکرده است. شکل صحیح تابع به صورت زیر است:

<?php

function multiply($a, $b) {
        return $a * $b;
    }
echo multiply(75,4);
flesh

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));
flesh

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");
flesh
   2013/03/15

تابع date_format خروجی را به فرمت مورد نظر ما تولید می کند.

مقادیر پارامتر :

پارامتر توضیحات
time اختیاری. رشته تاریخ/زمان را مشخص می کند. NULL زمان فعلی را نشان می دهد
timezone اختیاری. منطقه زمانی را مشخص می کند. پیش فرض منطقه زمانی فعلی است.

مثال:

<?php

echo "<pre>",
  print_r(date_create("2017-07-13"));
echo "</pre>";

خروجی:

flesh
   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");
flesh
   +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!!!!"));
flesh

hello!

معرفی تابع ()rtrim :

تابع ()rtrim فضای خالی یا سایر کاراکترهای از پیش تعریف شده را از سمت راست رشته حذف می کند.
 

سینتکس:

rtrim(string,charlist)

مثال:

<?php

$str = "Hello World!";
echo $str . "<br>";
echo rtrim($str,"World!");
flesh
    Hello World!
    Hello

مقادیر پارامتر :

پارامتر توضیحات
string
ضروری. رشته مورد بررسی را مشخص می کند
charlist
اختیاری. مشخص می کند کدام کاراکترها از رشته حذف شوند. در صورت حذف، تمام کاراکترهای زیر حذف می شوند:
  • “\0” – NULL
  • “\t” – tab
  • “\n” – new line
  • “\x0B” – vertical tab
  • “\r” – carriage return
  • ” ” – ordinary white space

 

تابع ()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>";
flesh
  Array
  (
      [0] => 7
      [1] => 5
      [2] => 4
      [3] => 8
      [4] => 6
  )
تابع ()str_split یک رشته را به یک آرایه تقسیم می کند.
تابع ()array_reverse یک آرایه را به ترتیب معکوس برمی گرداند.
 
بجای echo از ()print_r استفاده کردیم تا بتوانیم خروجی آرایه را داشته باشیم.

معرفی تابع ()str_split :

تابع str_split() یک رشته را به یک آرایه تقسیم می کند.
 
سینتکس:
str_split(string,length)

مثال:

<?php

echo "<pre>";
 print_r(str_split("Hello"));
echo "</pre>";
flesh
    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>";
flesh
    Array
    (
        [c] => Toyota
        [b] => BMW
        [a] => Volvo
    )

مقادیر پارامتر :

پارامتر توضیحات
array
ضروری.  یک آرایه را مشخص می کند
preserve

اختیاری –  مشخص می کند که آیا تابع باید کلیدهای آرایه را حفظ کند یا خیر. مقادیر ممکن:

  • true
  • false

۶. برنامه ای بنویسید که یک عدد را به عنوان ورودی گرفته و مجموع اعداد از ۱ تا آن عدد را پیدا کند. عدد همیشه یک عدد صحیح مثبت بزرگتر از صفر خواهد بود.

مثال:

    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);
flesh

36

روش دوم:

<?php

function summation($c)
{
   return array_sum(range(1, $c));
}
echo summation(8);
flesh

36

معرفی تابع ()range :

  • تابع ()range یک آرایه حاوی محدوده ای از عناصر ایجاد می کند.
  • این تابع آرایه ای از عناصر را از کم به زیاد برمی گرداند.
نکته: اگر پارامتر low بالاتر از پارامتر high باشد، آرایه محدوده از زیاد به پایین خواهد بود.
 
سینتکس:
range(low, high, step)

مثال:

<?php

$number = range(0,5);
echo "<pre>";
  print_r ($number);
echo "</pre>";
flesh
    Array
    (
        [0] => 0
        [1] => 1
        [2] => 2
        [3] => 3
        [4] => 4
        [5] => 5
    )

مقادیر پارامتر :

پارامتر توضیحات
low
ضروری. کمترین مقدار آرایه را مشخص می کند
high
ضروری. بالاترین مقدار آرایه را مشخص می کند
step
اختیاری. افزایش استفاده شده در محدوده را مشخص می کند. پیش فرض 1 است

معرفی تابع ()array_sum :

تابع ()array_sum مجموع تمام مقادیر آرایه را برمی گرداند.
 
سینتکس:
array_sum(array)

مثال:

<?php

$a=array(5,15,25);
echo array_sum($a);
flesh
    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);
flesh

3

روش دوم:

<?php

function quarterOf($month)
{   
  return ceil($month / 3);
}
echo quarterOf(7);
flesh

3

معرفی تابع ()ceil :

تابع ceil() در صورت لزوم یک عدد را تا نزدیکترین عدد صحیح گرد می کند.
نکته: برای گرد کردن یک عدد DOWN به نزدیکترین عدد صحیح، به تابع ()floor نگاه کنید.
نکته: برای گرد کردن یک عدد ممیز شناور، به تابع ()round نگاه کنید.
 
سینتکس:
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));
flesh
    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);
flesh

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

خروجی:

flesh

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

خروجی:

flesh

The quick brown fox jumps over the lazy dog.

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

  • تابع ()strrev یک متن را برعکس می کند.
  • تابع ()explode یک متن را به تکه کوچکتر تر به شکل یک آرایه تبدیل می کند.
  • تابع ()array_reverse یک آرایه را برعکس میکند.
  • تابع ()implode یک رشته را از عناصر یک آرایه برمی گرداند.

معرفی تابع ()strrev :

تابع ()strrev یک رشته را معکوس می کند.

سینتکس:

strrev(string)

مثال:

<?php

echo strrev("Hello World!");
flesh
    !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>";
flesh
    Array
    (
        [0] => Hello
        [1] => world.
        [2] => It's
        [3] => a
        [4] => beautiful
        [5] => day.
    )

مقادیر پارامتر :

پارامتر توضیحات
separator
ضروری. محل شکستن رشته را مشخص می کند
string
ضروری. رشته برای شکافتن
limit
اختیاری. تعداد عناصر آرایه برای بازگشت را مشخص می کند.
  • بزرگتر از 0 – آرایه ای را با حداکثر عنصر(های) حدی برمی گرداند.
  • کمتر از 0 – یک آرایه را به جز آخرین -limit عناصر() برمی گرداند.
  • 0 – آرایه ای با یک عنصر را برمی گرداند.

معرفی تابع ()implude :

تابع ()implode یک رشته را از عناصر یک آرایه برمی گرداند.

توجه: تابع ()implode پارامترهای خود را به هر ترتیب می پذیرد. با این حال، برای سازگاری با ()explode، باید از ترتیب مستند آرگومان ها استفاده کنید.

توجه: پارامتر جداکننده ()implode اختیاری است. با این حال، توصیه می شود همیشه از دو پارامتر برای سازگاری با عقب استفاده کنید.

توجه: این تابع binary-safe است.

در PHP، برخی از توابع به عنوان توابع binary-safe علامت گذاری شده اند. این بدان معنی است که توابع به درستی کار می کنند حتی زمانی که داده های باینری را ارسال می کنید.

سینتکس:

implode(separator,array)

مثال:

<?php

$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr)
flesh
    Hello World! Beautiful Day!

مقادیر پارامتر :

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