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

  • June 17, 2022 9:02 pm

۲۱. این اولین تمرین از چهارگانهء «رشته‌های مربع» است.

به شما یک رشته از n خط داده می شود که هر زیر رشته دارای n کاراکتر است: به عنوان مثال:

   s = “abcd\nefgh\nijkl\nmnop”   

ما برخی از تبدیلات این مربع از رشته ها را مطالعه خواهیم کرد.
n\ برای رفتن به خط بعدی است و چاپ نمی شود.
 
  • آینه عمودی: vert_mirror (یا vertMirror یا vert-mirror)
vert_mirror(s) => "dcba\nhgfe\nlkji\nponm"
  • آینه افقی: hor_mirror (یا horizontal mirror یا hor-mirror)
 hor_mirror(s) => "mnop\nijkl\nefgh\nabcd"

یا چاپ شده:

    vertical mirror |horizontal mirror 
    abcd --> dcba   |abcd --> mnop 
    efgh hgfe       |efgh ijkl 
    ijkl lkji       |ijkl efgh 
    mnop ponm       |mnop abcd

وظیفه:

  1. دو تابع vert_mirror و hor_mirror را بنویسید.
  2. تابع دست بالای oper(fct, s) را بنویسید. در این تابع پارامتر fct مشخص می کند که کدامیک از دو تابع vert_mirror و hor_mirror باید روی رشته اعمال شود.

مثال:

s = "abcd\nefgh\nijkl\nmnop"
oper(vert_mirror, s) => "dcba\nhgfe\nlkji\nponm"
oper(hor_mirror, s) => "mnop\nijkl\nefgh\nabcd"

پاسخ:

<?php

function vertMirror($s)
{
    // How to explode a multi-line string?
    // https://stackoverflow.com/questions/6162912/how-to-explode-a-multi-line-string
    return implode("\n", array_reverse(explode("\n", strrev($s))));
}
function horMirror($s)
{
    return implode("\n", array_reverse(explode("\n", $s)));
}
function oper($fct, $s)
{
    if ($fct == 'horMirror')
        return horMirror($s);
    else
        return vertMirror($s);
}
echo "<pre>";
  print_r(oper('horMirror', "abcd\nefgh\nijkl\nmnop\n"));
echo "</pre>";
flesh
  mnop
  ijkl
  efgh
  abcd

توابع ()implode و ()explode و ()array_reverse در تمرینات قبلی معرفی شدند.

۲۲. این دومین تمرین از چهارگانهء «رشته‌های مربع» است.

به شما یک رشته از n خط داده می شود که هر زیر رشته دارای n کاراکتر است: به عنوان مثال:

   s = “abcd\nefgh\nijkl\nmnop”   

ما برخی از تبدیلات این مربع از رشته ها را مطالعه خواهیم کرد.
n\ برای رفتن به خط بعدی است و چاپ نمی شود.
 
 
  • چرخش ساعتگرد ۱۸۰ درجه: rot
rot(s) => "ponm\nlkji\nhgfe\ndcba"
  • چرخش ساعتگرد ۱۸۰ درجه و نقاط پراکنده: selfie_and_rot
selfie_and_rot(s) =>
"abcd....\nefgh....\nijkl....\nmnop....\n....ponm\n....lkji\n....hgfe\n....dcba"

یا چاپ شده:

    |rotation          |selfie_and_rot 
    |abcd --> ponm     |abcd --> abcd.... 
    |efgh     lkji     |efgh     efgh.... 
    |ijkl     hgfe     |ijkl     ijkl.... 
    |mnop     dcba     |mnop     mnop.... 
                                 ....ponm 
                                 ....lkji 
                                 ....hgfe 
                                 ....dcba

توجه داشته باشید که تعداد نقاط برابر با طول مشترک “abcd”، “efgh”، “ijkl”، “mnop” است.

وظیفه:

  1. دو تابع rot و selfie_and_rot را بنویسید.
  2. تابع دست بالای oper(fct, s) را بنویسید. در این تابع پارامتر fct مشخص می کند که کدامیک از دو تابع rot و selfie_and_rot باید روی رشته اعمال شود.

مثال:

s = "abcd\nefgh\nijkl\nmnop"
oper(rot, s) => "ponm\nlkji\nhgfe\ndcba"
oper(selfie_and_rot, s) => "abcd....\nefgh....\nijkl....\nmnop....\n....ponm\n....lkji\n....hgfe\n....dcba"

پاسخ:

<?php

function rot($s)
{
    return strrev($s);
}
function selfieAndRot($s)
{
    $z = explode("\n", ($s));
    $dots = str_repeat(".", count($z));
    foreach ($z as $valuel) {
        $zz1[] = ($valuel . $dots);
    }
    $aa = explode("\n", strrev($s));
    foreach ($aa as $valuel) {
        $zz2[] = ($dots . $valuel);
    }
    return implode("\n", $zz1) . "\n" . implode("\n", $zz2);
}
function oper($fct, $s)
{
    if ($fct == 'rot')
        return rot($s);
    else
        return selfieAndRot($s);
}
echo "<pre>";
  print_r(oper('selfieAndRot', "hSgdHQ\nHnDMao\nClNNxX\niRvxxH\nbqTVvA\nwvSyRu"));
echo "</pre>";
flesh
    hSgdHQ......
    HnDMao......
    ClNNxX......
    iRvxxH......
    bqTVvA......
    wvSyRu......
    ......uRySvw
    ......AvVTqb
    ......HxxvRi
    ......XxNNlC
    ......oaMDnH
    ......QHdgSh

توابع ()implode و ()explode و ()strrev و ()str_repeat و ()count در تمرینات قبلی معرفی شدند.

۲۳. این سومین تمرین از چهارگانهء «رشته‌های مربع» است.

به شما یک رشته از n خط داده می شود که هر زیر رشته دارای n کاراکتر است: به عنوان مثال:

   s = “abcd\nefgh\nijkl\nmnop”   

ما برخی از تبدیلات این مربع از رشته ها را مطالعه خواهیم کرد.
n\ برای رفتن به خط بعدی است و چاپ نمی شود.
 
 
  • تقارن با توجه به قطر اصلی: diag_1_sym (یا diag1Sym یا diag-1-sym)
diag_1_sym(s) => "aeim\nbfjn\ncgko\ndhlp"
  • چر خش در جهت عقربه های ساعت 90 درجه: rot_90_clock (یا rot90Clock یا rot-90-clock)
rot_90_clock(s) => "miea\nnjfb\nokgc\nplhd"
  • selfie_and_diag1(s) (یا selfieAndDiag1 یا selfie-and-diag1): این یک رشته اولیه + رشته است که با تقارن نسبت به قطر اصلی به دست می آید.
s = "abcd\nefgh\nijkl\nmnop" --> 
"abcd|aeim\nefgh|bfjn\nijkl|cgko\nmnop|dhlp"

یا چاپ شده:

    selfie_and_diag1 
    abcd|aeim 
    efgh|bfjn 
    ijkl|cgko 
    mnop|dhlp

وظیفه:

  • این توابع را بنویسید: diag_1_sym و rot_90_clock و selfie_and_diag1
  • تابع مرتبه بالای oper(fct, s) را بنویسید.
  • fct تابع یک متغیر f برای اعمال به رشته s است (fct یکی از diag_1_sym، rot_90_clock، selfie_and_diag1 خواهد بود)

مثال:

   s = "abcd\nefgh\nijkl\nmnop" 
   oper(diag_1_sym, s) => "aeim\nbfjn\ncgko\ndhlp" 
   oper(rot_90_clock, s) => "miea\nnjfb\nokgc\nplhd" 
   oper(selfie_and_diag1, s) => "abcd|aeim\nefgh|bfjn\nijkl|cgko\nmnop|dhlp"

پاسخ:

<?php

function diag1Sym($s)
{
    $a = explode("\n", $s);
    foreach ($a as $key => $value) {
        foreach ($a as $keya => $valuea) {
            $zz1[$key][$keya] = $a[$keya][$key];
        }
    }
    foreach ($zz1 as $value) {
        $output[] = implode('', $value);
    }
    return implode("\n", $output);
}
function rot90Clock($s)
{
    $s = diag1Sym($s);
    return implode("\n", array_reverse(explode("\n", strrev($s))));
}
function selfieAndDiag1($s)
{
    $a = explode("\n", $s);
    $imp = explode("\n", diag1Sym($s));
    foreach ($a as $key => $value) {
        $output2[$key] = $a[$key] . "|" . $imp[$key];
    }
    return implode("\n", $output2);
}
function oper($fct, $s)
{
    return $fct($s);
}
echo "<pre>";
  print_r(oper('selfieAndDiag1', "abcd\nefgh\nijkl\nmnop"));
echo "</pre>";
flesh
abcd|aeim
efgh|bfjn
ijkl|cgko
mnop|dhlp

توابع ()implode و ()explode و ()strrev و ()array_reverse و ()count در تمرینات قبلی معرفی شدند.

۲۴. این چهارمین تمرین از چهارگانهء «رشته‌های مربع» است.

به شما یک رشته از n خط داده می شود که هر زیر رشته دارای n کاراکتر است: به عنوان مثال:

   s = “abcd\nefgh\nijkl\nmnop”   

ما برخی از تبدیلات این مربع از رشته ها را مطالعه خواهیم کرد.
n\ برای رفتن به خط بعدی است و چاپ نمی شود.
 
 
  • تقارن با توجه به مورب متقاطع اصلی: diag_2_sym (یا diag2Sym یا diag-2-sym)
diag_2_sym(s) => "plhd\nokgc\nnjfb\nmiea"
  • چرخش خلاف جهت عقربه های ساعت 90 درجه: rot_90_counter (یا rot90Counter یا rot-90-counter)
rot_90_counter(s)=> "dhlp\ncgko\nbfjn\naeim"
  • selfie_diag2_counterclock (یا selfieDiag2Counterclock یا selfie-diag2-counterclock) رشته اولیه + رشته است که با تقارن نسبت به مورب اصلی متقاطع + چرخش خلاف جهت عقربه های ساعت 90 درجه به دست می آید.
s = "abcd\nefgh\nijkl\nmnop" --> 
"abcd|plhd|dhlp\nefgh|okgc|cgko\nijkl|njfb|bfjn\nmnop|miea|aeim"

یا چاپ شده:

   selfie_diag2_counterclock 
   abcd|plhd|dhlp 
   efgh|okgc|cgko 
   ijkl|njfb|bfjn 
   mnop|miea|aeim

وظیفه:

  1. این توابع را بنویسید: diag_2_sym و  rot_90_counter و  selfie_diag2_counterclock
  2. تابع مرتبه بالا oper(fct,s) را بنویسید که در آن fct تابع یک متغیر f است که روی رشته s اعمال می شود (fct یکی از diag_2_sym، rot_90_counter، selfie_diag2_counterclock خواهد بود)

مثال:

   s = "abcd\nefgh\nijkl\nmnop"
   oper(diag_2_sym, s) => "plhd\nokgc\nnjfb\nmiea"
   oper(rot_90_counter, s) => "dhlp\ncgko\nbfjn\naeim"
   oper(selfie_diag2_counterclock, s) =>       "abcd|plhd|dhlp\nefgh|okgc|cgko\nijkl|njfb|bfjn\nmnop|miea|aeim"

پاسخ:

<?php

function transpose($array)
{
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}
function rot90Counter($s)
{
    $m = transpose(array_map("str_split", array_map("strrev", explode("\n", $s))));
    return implode("\n", array_map(function ($x) {
        return implode("", $x);
    }, $m));
}
function diag2Sym($s)
{
    return implode("\n", array_map("strrev", explode("\n", rot90Counter($s))));
}
function selfieDiag2Counterclock($s)
{
    $ts = explode("\n", $s);
    $tDiag = explode("\n", diag2Sym($s));
    $stcounter = explode("\n", rot90Counter($s));
    $result = [];
    for ($i = 0; $i < count($ts); $i++) {
        $result[$i] = $ts[$i] . "|" . $tDiag[$i] . "|" . $stcounter[$i];
    }
    return implode("\n", $result);
}
function oper($fct, $s)
{
    return $fct($s);
}
echo "<pre>";
  print_r(oper('selfieDiag2Counterclock', "abcd\nefgh\nijkl\nmnop"));
echo "</pre>";
flesh
abcd|plhd|dhlp
efgh|okgc|cgko
ijkl|njfb|bfjn
mnop|miea|aeim

توابع ()implode و ()explode و ()strrev و ()array_reverse  در تمرینات قبلی معرفی شدند.

۲۵. تابعی بنویسید که یک لیست را از لیست دیگر کم می کند و نتیجه را برمی گرداند.

تابع باید تمام مقادیری را که در لیست b وجود دارد از لیست a کم کند. همچنین ترتیب را حفظ نماید:
arrayDiff([1,2],[1]) == [2]
اگر مقداری در b وجود داشته باشد، باید تمام مقادیر آن از دیگری حذف شوند:
arrayDiff([1,2,2,2,3],[2]) == [1,3]

پاسخ:

<?php

function arrayDiff($a, $b)
{
    return array_values(array_diff($a, $b));
}
echo "<pre>";
  print_r(arrayDiff([1, 2, 2, 2, 3, 3], [2]));
echo "</pre>";
flesh
Array
(
    [0] => 1
    [1] => 3
    [2] => 3
)

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

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

مثال:

<?php

$a=array("Name"=>"Peter","Age"=>"41","Country"=>"USA");
print_r(array_values($a));
flesh
Array
(
    [0] => Peter
    [1] => 41
    [2] => USA
)

سینتکس:

array_values(array)

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

پارامتر توضیحات
array
ضروری. تعیین یک آرایه

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

تابع ()array_diff مقادیر دو (یا چند) آرایه را مقایسه می کند و تفاوت ها را برمی گرداند.
این تابع مقادیر دو (یا چند) آرایه را مقایسه می‌کند و آرایه‌ای را برمی‌گرداند که حاوی ورودی‌های آرایه ۱ است که در آرایه ۲ یا آرایه ۳ و غیره وجود ندارند.

مثال:

<?php

$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");
$result=array_diff($a1,$a2);
echo "<pre>";
  print_r($result);
echo "</pre>";
flesh
   Array
   (
       [d] => yellow
   )

سینتکس:

array_diff(array1, array2, array3, ...)

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

پارامتر توضیحات
array1
ضروری. آرایه ای برای مقایسه
array2
ضروری. آرایه ای برای مقایسه
array3,…
اختیاری. آرایه های بیشتر برای مقایسه با

۲۶. تابعی بنویسید که رشته ای از یک یا چند کلمه را دریافت کند و همان رشته را برگرداند، اما تمام کلمات پنج یا چند حرفی معکوس شوند. رشته های ارسال شده فقط از حروف و فاصله تشکیل شده است. فضاها فقط زمانی درج خواهند شد که بیش از یک کلمه وجود داشته باشد.

مثال:

   spinWords( "Hey fellow warriors" ) => returns "Hey wollef sroirraw" 
   spinWords( "This is a test" ) => returns "This is a test" 
   spinWords( "This is another test" )=> returns "This is rehtona test"

پاسخ:

<?php

function spinWords(string $str)
{
    return preg_replace_callback('/\w{5,}/', function ($matches) {
        return strrev($matches[0]);
    }, $str);
}
echo spinWords(" is currently unable to handle this request.");
flesh

is yltnerruc elbanu to eldnah this tseuqer.

تابعهای ()preg_replace_callback و ()strrev در تمرینهای قبلی معرفی شدند.

/\w{5,}/ یک عبارت RegEx است که برای پیدا کردن کلمات ۵ حرفی یا بیشتر استفاده شده است.

۲۷. تابعی بنویسید که اگر n یک عدد صحیح بود، رشته ای را با علامت های dash’-‘ قبل و بعد از هر عدد صحیح فرد برگرداند، اما رشته را با علامت خط تیره شروع یا پایان ندهد. اگر n منفی باشد، علامت منفی باید حذف شود. اگر n یک عدد صحیح نبود، یک مقدار خالی برگرداند.

مثال:

   dashatize(274) -> '2-7-4'
   dashatize(6815) -> '68-1-5'

پاسخ:

<?php

function dashatize(int $num): string
{
    return trim(str_replace('--', '-', preg_replace('/([13579])/', '-$1-', $num)), '-');
}
echo dashatize(124434568789);
flesh

1-244-3-4-5-68-7-8-9

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

تابع ()str_replace برخی از کاراکترها را با برخی کاراکترهای دیگر در یک رشته جایگزین می کند.
 
این تابع با قوانین زیر کار می کند:
  • اگر رشته مورد جستجو یک آرایه باشد، یک آرایه را برمی گرداند.
  • اگر رشته ای که باید جستجو شود یک آرایه است، پیدا کردن و جایگزینی با هر عنصر آرایه انجام می شود.
  • اگر هم find و هم replace آرایه باشند، و replace عناصر کمتری نسبت به find داشته باشد، یک رشته خالی به عنوان replace استفاده می شود.
  • اگر find یک آرایه و replace یک رشته باشد، رشته جایگزین برای هر مقدار find استفاده می شود.
توجه: این تابع به حروف بزرگ و کوچک حساس است. از تابع ()str_ireplace برای انجام جستجوی غیرحساس به حروف بزرگ و کوچک استفاده کنید.
 
توجه: این تابع binary-safe است.
 
 
سینتکس:
 
str_replace(find,replace,string,count)

مثال:

<?php

echo str_replace("world","Peter","Hello world!");
flesh
   Hello Peter!

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

پارامتر توضیحات
find
ضروری. مقدار مورد نظر را مشخص می کند.
replace
ضروری. مقدار را برای جایگزینی مقدار در find مشخص می کند.
string
ضروری. رشته مورد جستجو را مشخص می کند.
count
اختیاری. متغیری که تعداد تعویض ها را می شمارد.

۲۸. data و data1 دو رشته با رکورد بارندگی چند شهر برای ماهها از ژانویه تا دسامبر است. سوابق شهرها با n\ جدا می شوند. پس از نام هر شهر دو نقطه : قرار دارد.

وظیفه:

  1. تابع: mean(town, strng) باید میانگین بارندگی شهر و داده strng یا data1 را برگرداند (در R و Julia این تابع avg را فراخوانی می کند).
  2. تابع: (town، strng)variance باید واریانس بارندگی برای شهر town و داده strng یا data1 را برگرداند.

مثال:

mean("London", data), 51.19(9999999999996) 
variance("London", data), 57.42(833333333374)

ملاحظات:

  • اگر میانگین یا واریانس توابع به عنوان شهر پارامتر شهری باشد که هیچ رکوردی ندارد -1 یا -1.0 (بسته به زبان) برمی‌گرداند.
  • کوتاه یا گرد نکنید: بسته به زبان، اگر abs(نتیجه_شما – نتیجه_تست) <= 1e-2 یا abs((نتیجه_آزمایش_تست) / نتیجه_تست) <= 1e-6 باشد، آزمون ها با موفقیت انجام می شود.
  • مرجع: http://www.mathsisfun.com/data/standard-deviation.html

پاسخ:

ابتدا فایل datafile.php را که حاوی اطلاعات بارندگی شهرها است ایجاد می کنیم.

<?php

$data1 =
"Rome:Jan 81.2,Feb 63.2,Mar 70.3,Apr 55.7,May 53.0,Jun 36.4,Jul 17.5,Aug 27.5,Sep 60.9,Oct 117.7,Nov 111.0,Dec 97.9\n"
. "London:Jan 48.0,Feb 38.9,Mar 39.9,Apr 42.2,May 47.3,Jun 52.1,Jul 59.5,Aug 57.2,Sep 55.4,Oct 62.0,Nov 59.0,Dec 52.9\n"
. "Paris:Jan 182.3,Feb 120.6,Mar 158.1,Apr 204.9,May 323.1,Jun 300.5,Jul 236.8,Aug 192.9,Sep 66.3,Oct 63.3,Nov 83.2,Dec 154.7\n"
. "NY:Jan 108.7,Feb 101.8,Mar 131.9,Apr 93.5,May 98.8,Jun 93.6,Jul 102.2,Aug 131.8,Sep 92.0,Oct 82.3,Nov 107.8,Dec 94.2\n"
. "Vancouver:Jan 145.7,Feb 121.4,Mar 102.3,Apr 69.2,May 55.8,Jun 47.1,Jul 31.3,Aug 37.0,Sep 59.6,Oct 116.3,Nov 154.6,Dec 171.5\n"
. "Sydney:Jan 103.4,Feb 111.0,Mar 131.3,Apr 129.7,May 123.0,Jun 129.2,Jul 102.8,Aug 80.3,Sep 69.3,Oct 82.6,Nov 81.4,Dec 78.2\n"
. "Bangkok:Jan 10.6,Feb 28.2,Mar 30.7,Apr 71.8,May 189.4,Jun 151.7,Jul 158.2,Aug 187.0,Sep 319.9,Oct 230.8,Nov 57.3,Dec 9.4\n"
. "Tokyo:Jan 49.9,Feb 71.5,Mar 106.4,Apr 129.2,May 144.0,Jun 176.0,Jul 135.6,Aug 148.5,Sep 216.4,Oct 194.1,Nov 95.6,Dec 54.4\n"
. "Beijing:Jan 3.9,Feb 4.7,Mar 8.2,Apr 18.4,May 33.0,Jun 78.1,Jul 224.3,Aug 170.0,Sep 58.4,Oct 18.0,Nov 9.3,Dec 2.7\n"
. "Lima:Jan 1.2,Feb 0.9,Mar 0.7,Apr 0.4,May 0.6,Jun 1.8,Jul 4.4,Aug 3.1,Sep 3.3,Oct 1.7,Nov 0.5,Dec 0.7";
$data2 =
    "Rome:Jan 90.2,Feb 73.2,Mar 80.3,Apr 55.7,May 53.0,Jun 36.4,Jul 17.5,Aug 27.5,Sep 60.9,Oct 147.7,Nov 121.0,Dec 97.9\n"
    ."London:Jan 58.0,Feb 38.9,Mar 49.9,Apr 42.2,May 67.3,Jun 52.1,Jul 59.5,Aug 77.2,Sep 55.4,Oct 62.0,Nov 69.0,Dec 52.9\n"
    ."Paris:Jan 182.3,Feb 120.6,Mar 188.1,Apr 204.9,May 323.1,Jun 350.5,Jul 336.8,Aug 192.9,Sep 66.3,Oct 63.3,Nov 83.2,Dec 154.7\n"
    ."NY:Jan 128.7,Feb 121.8,Mar 151.9,Apr 93.5,May 98.8,Jun 93.6,Jul 142.2,Aug 131.8,Sep 92.0,Oct 82.3,Nov 107.8,Dec 94.2\n"
    ."Vancouver:Jan 155.7,Feb 121.4,Mar 132.3,Apr 69.2,May 85.8,Jun 47.1,Jul 31.3,Aug 37.0,Sep 69.6,Oct 116.3,Nov 154.6,Dec 171.5\n"
    ."Sydney:Jan 123.4,Feb 111.0,Mar 151.3,Apr 129.7,May 123.0,Jun 159.2,Jul 102.8,Aug 90.3,Sep 69.3,Oct 82.6,Nov 81.4,Dec 78.2\n"
    ."Bangkok:Jan 20.6,Feb 28.2,Mar 40.7,Apr 81.8,May 189.4,Jun 151.7,Jul 198.2,Aug 197.0,Sep 319.9,Oct 230.8,Nov 57.3,Dec 9.4\n"
    ."Tokyo:Jan 59.9,Feb 81.5,Mar 106.4,Apr 139.2,May 144.0,Jun 186.0,Jul 155.6,Aug 148.5,Sep 216.4,Oct 194.1,Nov 95.6,Dec 54.4\n"
    ."Beijing:Jan 13.9,Feb 14.7,Mar 18.2,Apr 18.4,May 43.0,Jun 88.1,Jul 224.3,Aug 170.0,Sep 58.4,Oct 38.0,Nov 19.3,Dec 2.7\n"
    ."Lima:Jan 11.2,Feb 10.9,Mar 10.7,Apr 10.4,May 10.6,Jun 11.8,Jul 14.4,Aug 13.1,Sep 23.3,Oct 1.7,Nov 0.5,Dec 10.7";

سپس آن را در فایل اصلی include می کنیم:

<?php

function extract_town($town1, $strng1)
{
    // https://regex-generator.olafneumann.org/
    $nnn = preg_replace_callback('/[a-zA-Z]+:/', function ($matches) {
        return "  " . $matches[0];
    }, $strng1);
    $mmm = explode("  ", $nnn);
    $zzz = array_filter($mmm, function ($var) use ($town1) {
        return preg_match("/\b$town1\b/i", $var);
    });
    $sss = implode("", $zzz);
    // Replace multiple characters in one replace call:
    // https://stackoverflow.com/questions/16576983/replace-multiple-characters-in-one-replace-call
    $ggg = preg_replace('/[a-zA-Z]|:|,/', "", $sss);
    $yyy = ltrim($ggg);
    $bbb = explode(" ", $yyy);
    return $bbb;
}
function mean($town, $strng)
{
    if (preg_match("/$town/", $strng) === 0) {
        return -1;
    }
    $aaa = extract_town($town, $strng);
    // https://www.ajdesigner.com/php_code_statistics/variance_sample.php
    // calculate the mean
    $the_mean = array_sum($aaa) / count($aaa);
    return $the_mean;
}
function variance($town, $strng)
{
    if (preg_match("/$town/", $strng) === 0) {
        return -1;
    }
    $aaa = extract_town($town, $strng);
    // https://www.ajdesigner.com/php_code_statistics/variance_sample.php
    // calculate the variance
    $the_variance = 0.0;
    $the_mean = array_sum($aaa) / count($aaa);
    for ($i = 0; $i < count($aaa); $i++) {
        //sum the array
        $the_variance = $the_variance + ($aaa[$i] - $the_mean) * ($aaa[$i] - $the_mean);
    }
    $the_variance = $the_variance / (count($aaa) /*- 1.0*/);
    //return the variance
    return $the_variance;
}
include 'datafile.php';
// PHPStorm: undefined variables caused by include/require
// https://stackoverflow.com/questions/22476778/phpstorm-undefined-variables-caused-by-include-require
/**
 * @var string $data1
 * @var string $data2
 */
echo "<pre>";
  print_r(variance("London", $data1));
echo "</pre>";
flesh
57.428333333333

تابع های ()preg_replace_callback و ()explode و ()array_sum و ()count در تمرینات قبلی معرفی شدند.

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

تابع ()preg_match برمی‌گرداند که آیا مطابقت در یک رشته پیدا شده است یا خیر.
 
 
سینتکس:
preg_match(pattern, input, matches, flags, offset)

مثال:

<?php

$str = "Visit W3Schools";
$pattern = "/w3schools/i";
echo preg_match($pattern, $str);
flesh

1

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

پارامتر توضیحات
pattern
ضروری. شامل یک عبارت منظم است که نشان می دهد چه چیزی باید جستجو شود.
input
ضروری. رشته ای که جستجو در آن انجام خواهد شد.
matches
اختیاری. متغیر مورد استفاده در این پارامتر با آرایه‌ای پر می‌شود که شامل همه موارد منطبق است
flags
اختیاری. مجموعه ای از گزینه ها که نحوه ساختار آرایه مطابقت را تغییر می دهد:
  • PREG_OFFSET_CAPTURE – وقتی این گزینه فعال باشد، هر تطابق، به جای اینکه یک رشته باشد، آرایه ای خواهد بود که عنصر اول یک زیررشته حاوی تطابق و عنصر دوم موقعیت اولین کاراکتر رشته فرعی در ورودی است.
  • PREG_UNMATCHED_AS_NULL – وقتی این گزینه فعال باشد، الگوهای فرعی ناهمسان به جای رشته خالی به صورت NULL برگردانده می شوند.
offset
اختیاری. پیش‌فرض به 0 می‌رسد. نشان می‌دهد که تا چه اندازه در رشته برای شروع جستجو است. تابع ()preg_match منطبقاتی را که قبل از موقعیت داده شده در این پارامتر رخ می دهد، پیدا نمی کند.

۲۹. تابعی بنویسید که دو ماتریس مربع (N x N آرایه دو بعدی) را بپذیرد و مجموع آن دو را برگرداند. هر دو ماتریس ارسال شده به تابع دارای اندازه N x N (مربع) خواهند بود که فقط شامل اعداد صحیح هستند.

چگونه دو ماتریس را جمع کنیم:
هر سلول [n][m] را از ماتریس اول بگیرید و با همان [n][m] سلول از ماتریس دوم اضافه کنید. این سلول [n][m] ماتریس حل شده خواهد بود.
 
مثال:
    |1 2 3|     |2 2 1|     |1+2 2+2 3+1|     |3 4 4|
    |3 2 1|  +  |3 2 3|  =  |3+3 2+2 1+3|  =  |6 4 4|
    |1 1 1|     |1 1 3|     |1+1 1+1 1+3|     |2 2 4|

پاسخ:

<?php

function matrix_addition($ar1, $ar2): array
{
    for ($row = 0; $row < count($ar1); $row++) {
        for ($col = 0; $col < count($ar1[0]); $col++) {
            $result[$row][$col] = ($ar1[$row][$col]) + ($ar2[$row][$col]);
        }
    }
    return $result;
}
$a = array(
    [10, 3, 5],
    [2, 4, 6],
    [2, 4, 9],
);
$b = array(
    [1, 2, 5],
    [3, 4, 3],
    [3, 4, 6],
);
echo "<pre>";
  print_r(matrix_addition($a, $b));
echo "</pre>";
flesh
Array
(
    [0] => Array
        (
            [0] => 11
            [1] => 5
            [2] => 10
        )

    [1] => Array
        (
            [0] => 5
            [1] => 8
            [2] => 9
        )

    [2] => Array
        (
            [0] => 5
            [1] => 8
            [2] => 15
        )

)

۳۰. شما باید تابعی بسازید که اگر پارامترهای داده شده مختصات جغرافیایی معتبری باشند اعتبار سنجی کند.

مختصات معتبر مانند زیر است: “23.32353342, -32.543534534”. مقدار بازگشتی باید درست یا نادرست باشد.
 
عرض جغرافیایی (که اولین float است) می تواند بین 0 تا 90 باشد، مثبت یا منفی.
طول جغرافیایی (که float دوم است) می تواند بین 0 تا 180 باشد، مثبت یا منفی.
 
مختصات فقط می توانند دارای اعداد یا یکی از نمادهای زیر باشند (از جمله فاصله بعد از کاما) __ -، . __
بین علامت منفی “-” و رقم بعد از آن نباید فاصله ای وجود داشته باشد.
 
 
در اینجا چند مختصات معتبر وجود دارد:
  • -23, 25
  • 24.53525235, 23.45235
  • 04, -23.234235
  • 43.91343345, 143
  • 4, -3
و چند مورد نامعتبر:
 
  • 23.234, – 23.4234
  • 2342.43536, 34.324236
  • N23.43345, E32.6457
  • 99.234, 12.324
  • 6.325624, 43.34345.345
  • 0, 1,2
  • 0.342q0832, 1.2324
 

پاسخ:

<?php

function isValidCoordinates($coordinates)
{
    $mmm = explode(" ", $coordinates);
    $mmm[0] = rtrim($mmm[0], ",");
    if (
        is_numeric($mmm[0])
        && is_numeric($mmm[1])
        && ($mmm[0] >= -90 && $mmm[0] <= 90)
        && ($mmm[1] >= -180 && $mmm[1] <= 180)
        && !preg_match("/e/i", $coordinates)
    )
        return "true";
    else
        return "false";
}
//$a = "0, 1,2";
$a = "-23, 25";
echo(isValidCoordinates($a));
flesh

true

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

تابع ()is_numeric بررسی می کند که متغیر یک عدد است یا یک رشته عددی.
اگر متغیر یک عدد یا یک رشته عددی باشد، این تابع true (1) را برمی‌گرداند، در غیر این صورت false/nothing را برمی‌گرداند.

سینتکس:

is_numeric(variable);

مثال:

<?php

$a = 32;
echo "a is " . is_numeric($a) . "<br>";
$b = 0;
echo "b is " . is_numeric($b) . "<br>";
$c = 32.5;
echo "c is " . is_numeric($c) . "<br>";
$d = "32";
echo "d is " . is_numeric($d) . "<br>";
$e = true;
echo "e is " . is_numeric($e) . "<br>";
$f = null;
echo "f is " . is_numeric($f) . "<br>";
?>
flesh

a is 1
b is 1
c is 1
d is 1
e is
f is

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

پارامتر توضیحات
variable
ضروری. متغیری را برای بررسی مشخص می کند.

۳۱. با توجه به آرایه ای از اعداد صحیح، اعدادی را که به تعداد فرد ظاهر می شود، پیدا کنید.

همیشه فقط یک عدد صحیح وجود خواهد داشت که به تعداد فرد ظاهر می شود.
 
مثال:
[7] باید 7 را برگرداند، زیرا 1 بار رخ می دهد (که فرد است).
[0] باید 0 را برگرداند، زیرا 1 بار رخ می دهد (که فرد است).
[1،1،2] باید 2 را برگرداند، زیرا 1 بار رخ می دهد (که فرد است).
[0,1,0,1,0] باید 0 را برگرداند، زیرا 3 بار اتفاق می افتد (که فرد است).
[1،2،2،3،3،3،4،3،3،3،2،2،1] باید 4 را برگرداند، زیرا 1 بار ظاهر می شود (که فرد است).

پاسخ:

روش اول:

<?php

function findIt(array $seq)
{
    $y = array_count_values($seq);
    foreach ($y as $value) {
        if ($value % 2 !== 0)
            return array_search($value, $y);
    }
}
echo "<pre>";
  print_r(findIt([20, 1, 1, 2, 2, 3, 3, 5, 5, 4, 20, 4, 5]));
echo "</pre>";
flesh

5

روش دوم:

<?php

function findIt(array $seq)
{
     $nums = array_count_values($seq);
    foreach ($nums as $key => $val) {
        if ($val % 2) {
            return $key;
        }
    }
}
echo "<pre>";
  print_r(findIt([20, 1, 1, 2, 2, 3, 3, 5, 5, 4, 20, 4, 5]));
echo "</pre>";
flesh

5

تابع ()array_search در تمرین های قبلی معرفی شد.

۳۲. آرایه ای از اعداد به شما داده می شود. شما باید اعداد فرد را به ترتیب صعودی مرتب کنید در حالی که اعداد زوج را در موقعیت اصلی خود نگه دارید.

مثال:

[7, 1]  =>  [1, 7]
[5, 8, 6, 3, 4]  =>  [3, 8, 6, 5, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  =>  [1, 8, 3, 6, 5, 4, 7, 2, 9, 0]

پاسخ:

<?php

function sortArray(array $arr)
{
    $even = $odd = array();
    // Reset keys:
    foreach ($arr as $a) {
        if ($a % 2 == 0)
            $even[] = $a;
        else
            $odd[] = $a;
    }
    sort($odd);
    $newArr = [];
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i] % 2 == 0) {
            $newArr[] = array_shift($even);
        } else {
            $newArr[] = array_shift($odd);
        }
    }
    return $newArr;
}
echo "<pre>";
  print_r(sortArray([5, 3, 2, 8, 1, 4]));
echo "</pre>";
flesh
    Array
    (
       [0] => 1
       [1] => 3
       [2] => 2
       [3] => 8
       [4] => 5
       [5] => 4
    )

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

تابع ()array_shift اولین عنصر را از یک آرایه حذف می کند و مقدار عنصر حذف شده را برمی گرداند.
توجه: اگر کلیدها عددی باشند، همه عناصر کلیدهای جدیدی دریافت می کنند که از 0 شروع می شود و یکی یکی افزایش می یابد (به مثال توجه کنید).
 
سینتکس:
array_shift(array)

مثال:

<?php

$a=array("a"=>"red","b"=>"green","c"=>"blue");
echo array_shift($a);
echo "<pre>";
print_r ($a);
echo "</pre>";
flesh

red

Array
(
    [b] => green
     => blue
)

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

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