المصفوفات والدوال.
هذا الدرس ضمن سلسة دروس الدورة التالية لتعلم لغة php !
المصفوفات :
كما مر معنا في الدروس السابقة , يمكن للمتغيرات ان تحوي قيمة واحدة فقط , فجاءت المصفوفات لتحل هذا القصور و تُمكن المبرمج من تخزين عدة قيم في متغير واحد يسمى بالمصفوفة , (المصفوفات في البرمجة تختلف اختلافا كليا عن المصفوفات الرياضية) , واذا كنت قد تعاملت مع المصفوفات بلغات برمجة غير php ستجد ان php لها طريقة خاصة ومرونة كبيرة جداً في التعامل مع المصفوفات كما سنرى في سياق هذا الدرس .
- المصفوفات تتكون من ما يُعرف بمفتاح أو مُعرف العنصر داخل المصفوفة وهو الـ key أو الـ index للمصفوفة ويبدأ من 0 إلى أقل من عدد عناصر المصفوفة بمقدار واحد (لإن العد يبدأ من الصفر) وكل عنصر من عناصر المصفوفة يحتوي على قيمة مرتبطة بهذا المفتاح , في php يمكن أن تكون هذه القيمة أي نوع من أنواع البيانات سواء عدد صحيح أو كسري أو قيمة منطقية أو القيمة الفارغة أو مصفوفة أو كائن .
لتخزبن قيم ما على شكل مصفوفة عليك فقط أن تضع الأقواس المربعة [] بعد اسم المتغير وتقوم بإسناد القيم للمصفوفة كالتالي :
<?php
$myArr[] = 10; //key = 0 , value = 10
$myArr[] = 12.16; //key = 1 , value = 12.16
$myArr[] = true; //key = 2 , value = true
$myArr[] = "Mostafa"; //key = 3 , value = "Mostafa"
$myArr[] = 'Jamal'; //key = 4 , value = 'Jamal'
for($i = 0; $i < 5; $i++)
{
echo '<h3>'.$myArr[$i].'</h3>';
}
?>
- واضح من الكود السابق أنه بإمكاننا تخزين أنواع مختلفة من البيانات داخل المصفوفات سواء ً أكانت نص أم رقم أم رقم ذو فاصلة عشرية ...
ويمكن أيضاً تخزين القيم في المصفوفة بالشكل المعتاد كما في أغلب لغات البرمجة , وفي حال أردنا طباعة قيمة المصفوفة داخل علامتي الإقتباس يجب وضعها بين قوسين {} كالتالي :
<?php
$myArr[0] = 10;
$myArr[1] = 12.16;
$myArr[2] = true;
$myArr[3] = "Mostafa";
$myArr[4] = 'Jamal';
for($i = 0; $i < 5; $i++)
{
echo "<h3>{$myArr[$i]}</h3>";
}
?>
- تم استخدام حلقة التكرار for لاخراج عناصر المصفوفة حيث i تتدرج من الصفر وحتى عدد عناصر المصفوفة ناقص واحد (حيث i<5 تكافئ i<=4) .
- ولإعطاء قيم للمصفوفة عند تعريفها دفعة واحدة نستخدم الكلمة المحجوزة array وتوضع العناصر بين قوسين ويفصل بينها فاصلة ',' كالتالي :
<?php
$myArr = array(10, 12.16, true, "Mostafa", 'Jamal');
for($i = 0; $i < 5; $i++)
{
echo "<h3>{$myArr[$i]}</h3>";
}
?>
- و لمعرفة عدد عناصر المصفوفة نستخدم الدالة count , التي تقبل وسيطا واحدا هو المصفوفة المُراد معرفة عدد عناصرها , وتُعيد عدد عناصر المصفوفة , كما في المثال التالي :
<?php
$myArr = array(10, 12.16, true, "Mostafa", 'Jamal');
for($i = 0; $i < count($myArr); $i++)
{
echo "<h3>{$myArr[$i]}</h3>";
}
?>
المصفوفات المتعددة الابعاد :
كما ذكرنا سابقا , يمكن ان يكون اي عنصر من عناصر مصفوفة من أي نوع من البيانات , فإذا كانت قيمة هذا العنصر مصفوفة حصلنا على مصفوفة متعددة الابعاد .
- ويمكن تمثيل المصفوفات متعددة الابعاد على أنها مصفوفات أحادية متداخلة والتالي تمثيل مصفوفة 2X3 :
<?php
$myArr[0][] = "Ahmed";
$myArr[0][] = "Mostafa";
$myArr[0][] = 10;
$myArr[1][] = 12;
$myArr[1][] = 45.99;
$myArr[1][] = true;
for($i = 0; $i < count($myArr); $i++)
{
for($j = 0; $j < count($myArr[$i]); $j++)
{
echo "<h3>{$myArr[$i][$j]}</h3>";
}
}
?>
- ولإسناد القيم دفعة واحدة عند تعريف المتغير يكون كالتالي :
<?php
$myArr = array(
array('Ahmed', "Mostafa", 10),
array(12, 45.99, true)
);
for($i = 0; $i < count($myArr); $i++)
{
for($j = 0; $j < count($myArr[$i]); $j++)
{
echo "<h3>{$myArr[$i][$j]}</h3>";
}
}
?>
وهكذا يمكن إسناد مصفوفات داخل مصفوفات بأي عدد من الابعاد تُريد , أي يُمكن انشاء مصفوفات ذات عشر أبعاد , لكن لا يُمكن التعامل معها بسهولة (هذا اذا امكن التعامل معها اساسا ً) .
المصفوفات المترابطة :
وتكون باستخدام سلاسل نصية للـ key للمصفوفة بدلاً من الأرقام حيث كل عنصر في المصفوفة يتألف من قسمين : الأول هو المفتاح key والثاني هو القيمة value :
<?php //وضعنا فراغات في بعض عناصر المصفوفة لكي لا تظهر الكلمات ملتصقة ببعضها البعض $myArr['name'] = 'Jamal '; $myArr['age'] = 30; $myArr['city'] = ' luxor '; $myArr['phone']= 125668522; echo $myArr['name'].$myArr['age'].$myArr['city'].$myArr['phone']; ?>
كما يمكن أن يكون مُعرف القيم سلاسل النصية وترقيم الرقمي معا ً للمصفوفة في مصفوفة واحدة كما سنرى , وهناك دوال مهمة لعرض محتويات وبيانات المتغيرات و المصفوفات والكائنات وهي var_dump و print_r و var_export سنستخدمها لعرض لطباعة محتويات المصفوفة من القيم والـ key لكل قيمة , وتقبل - هذه الدوال - وسيطا واحدا ً هو المصفوفة المُراد طباعتها , كما في المثال التالي :
<?php $myArr['name'] = 'Jamal'; $myArr[] = "Mostafa"; $myArr['age'] = 30; $myArr[] = 40; $myArr['city'] = 'luxor'; $myArr[] = 'Cairo'; $myArr['phone']= 125668522; $myArr[] = 124559587; echo var_export($myArr); ?>
ولإسناد القيم من هذا النوع من المصفوفات عند التعريف دفعة واحدة يكون كالتالي :
<?php
$myArr = array('name' => 'Jamal', 'city' => 'luxor', 'phone' => 125668522);
echo var_export($myArr);
?>
دالة foreach للدوران على عناصر المصفوفة :
من أفضل الطرق للدوران على عناصر المصفوفة وبالأخص المصفوفات المترابطة هو إستخدام دالة foreach, ويمكن من خلالها إستخراج القيمة أو القيمة و المُعرف (المفتاح) والشكل العام لها هو :
foreach ($array as $key => $value)
{
//$key هو مفتاح المصفوفة
//$value هي القيمة المرتبطة بالمفتاح
}
والمثال التالي يوضح فكرة عملها :
<?php
$myArr = array('name' => 'Jamal', 'city' => 'luxor', 'phone' => 125668522);
foreach($myArr as $value)
{
//استخدام الدالة foreach للحصول على القيمة فقط
echo "<h3>$value</h3>";
}
foreach($myArr as $key=>$value)
{
//الحصول على المفتاح (المُعرف) و القيمة
echo "<h3>$key : $value</h3>";
}
?>مثال آخر :
<?php
$myArr = array('name' => 'Jamal', 'Ahmed', 'city' => 'luxor', 'phone' => 125668522, 'Ciro', 125885465);
foreach($myArr as $key => $value)
{
echo "<h3>$key : $value</h3>";
}
?>
دوال التحكم بالمصفوفات
يوجد عدة دوال لاجراء العمليات المختلفة على المصفوفات (تقسيم مصفوفة لعدة اجزاء, ترتيب مصفوفة, عكس مصفوفة ....الخ) وسيتم شرح اشهر تلك الدوال :
الدالة explode :
تقوم هذه الدالة بتقطيع نص وتحويله الى مصفوفة حيث تقبل وسيطين اجباريين الوسيط الاول هو "الفاصل" الذي عنده يتم اقتطاع الجملة و الوسيط الثاني هو النص , لازالة الغموض سوف نأخذ مثالا بسيطا : بفرض اننا نريد ان نجعل كل كلمة في جملة معينة عنصرا من عناصر مصفوفة وبالتالي يكون الفاصل هو "الفراغ" كما في الكود التالي :
<?php
$string = 'this is a sting';
$array = explode(' ', $string);
print_r($array);
?>
- تُستخدم هذه الدالة بكثرة عند القراءة من الملفات النصية كما سنجد في دورس لاحقة باذن الله.
الدالة implode :
تقوم هذه الدالة - تقريبا ً- بعكس عمل الدالة explode , أي انها تقوم بتحويل عناصر مصفوفة الى الى نص يفصل بينها "فاصل" :
$string = implode ($glue, $pieces);
حيث الوسيط الاول هو الفاصل و الوسيط الثاني هو المصفوفة المُراد تحويل جميع عناصرها الى سلسلة نصية , جرب المثال التالي لتعرف مزيدا ً عن عمل هذه الدالة :
<?php
$array = array(10, 12.16, true, "Mostafa", 'Jamal');
$string = implode(' -- ', $array);
echo $string;
#outputs : 10 -- 12.16 -- 1 -- Mostafa -- Jamal
?>
الدالة is_array :
تقوم هذه الدالة بالتحقق من ان الوسيط المُمرر لها هو مصفوفة وذلك باعادة القيمة true او false :
<?php
$string = 'this is a sting';
$array = explode(' ', $string);
echo is_array($array);
//this will output '1'
?>
إضافة قيمة الى المصفوفة :
-كما مر معنا سابقا يمكن اضافة عنصر جديد بواسطة القوسين [] كالتالي :
<?php
$array = array('ahmad', 'abd alltif', 'mostafa');
echo 'the array is : <br>';
print_r($array);
$array[] = 'omar';
echo '<br>the array after adding omar is :<br>';
print_r($array);
?>
او باستخدام الدالة array_push حيث تقبل وسيطين الاول هو المصفوفة الهدف والثاني هو القيمة المراد اضافتها ,نعدل الملف السابق كي يستخدم الدالة array_push
<?php
$array = array('ahmad', 'abd alltif', 'mostafa');
echo 'the array is : <br>';
print_r($array);
#$array[] = 'omar'; this line is repalced by :
array_push($array, 'omar');
echo '<br>the array after adding omar is :<br>';
print_r($array);
?>
البحث داخل المصفوفات :
نستخدم الدالة in_array للبحث داخل المصفوفة عن قيمة معينة, هذه الدالة تعيد true في حال نجاحها:
<?php
$array = array('ahmad', 'abd alltif', 'mostafa', 'omar');
if(in_array('omar', $array) == true)
{
echo 'omar is found in $array array <br>';
}
if(in_array('jamal', $array) == false)
{
echo 'jamal is NOT found in $array array <br>';
}
?>
حيث الوسيط الاول هو القيمة المُراد البحث عنها والوسيط الثاني هو المصفوفة الهدف .
قلب مصفوفة :
حيث تستخدم الدالة array_reverse لقلب ترتيب مصفوفة اي جعل اول عنصر اخر عنصر و هكذا , المثال التالي يوضح الفكرة :
<?php
$array = array('1', '2', '3', '4');
$new_array = array_reverse($array);
print_r($new_array); #outputs : Array ( [0] => 4 [1] => 3 [2] => 2 [3] => 1 )
?>
الدالة array_unique : تقوم الدالة array_unique بإزالة أي قيمة تتكرر في المصفوفة , حيث تعيد مصفوفة جديدة بدن أي عناصر مكررة :
<?php
$array = array('ahmad', 'abd alltif', 'mostafa', 'ahmad', 'mostafa', 'omar');
$new_array = array_unique($array);
echo 'the first array is : ';
print_r($array); # Array ( [0] => ahmad [1] => abd alltif [2] => mostafa [3] => ahmad [4] => mostafa [5] => omar )
echo '<br> the "unique" one : ';
print_r($new_array); # Array ( [0] => ahmad [1] => abd alltif [2] => mostafa [5] => omar )
?>لاحظ مفاتيح المصفوفة الثانية .
ترتيب عناصر المصفوفة :
يتم ذلك بواسطة الدالتين sort و asort , حيث تقوم الدالة sort بترتيب عناصر مصفوفة تصاعديا ً , شكلها العام كالتالي :
sort($array);
حيث لا تعيد هذه الدالة أي قيمة , أي تقوم بتعديل المصفوفة مباشرة . الوسيط الأول هو المصفوفة المُراد ترتيب عناصرها .
<?php $array = array(123, 1, 12, 'name' => 'ahmad', 'abd alltif'); print_r($array); sort($array); echo '<br>'; print_r($array); ?>
لاحظ أن المصفوفة المرتبة لا تحتفظ بمفاتيح المصفوفة الاصلية , وللاحتفاظ بها نستخدم الدالة asort التي تقوم بنفس عمل sort لكنها تحتفظ بقيم المفاتيح أو المُعرفات :
<?php $array = array(123, 1, 12, 'name' => 'ahmad', 'abd alltif'); print_r($array); asort($array); echo '<br>'; print_r($array); ?>
الدوال :
تُوفر php عددا كبيرا من الدوال يتجاوز عددها الالف دالة , ناهيك عن العدد الضخم من المكتبات الاخرى التي تقوم بعدد لا باس به من العمليات , لكن بشكل أو باخر ستحتاج الى دالة جديدة تقوم بمهمة معينة لبرنامجك .
الشكل العام لتعريف الدالة هو :
function functionName(/*وسائط الدالة*/)
{
/*
جسم الدالة
*/
}
- وسائط الدالة
يمكنها أن تقبل أي نوع من البيانات , وكذلك يمكنها اعادة بأي نوع من البيانات أو عدم الرجوع بأي قيمة , الدالة التالية دالة لا تأخذ أي وسائط ولا تُعيد أي قيمة فقط تطبع جملة على المتصفح , ولتشغيل هذه الدالة علينا استدعائها بكتابة اسمها و من ثم قوسين () كما يلي :
<?php
function f_echo()
{
echo "<h1>Arab TEAM 2000</h1>";
}
f_echo();
?>أما الدالة التالية فهي تأخذ وسيطا لتقوم بطباعته ضمن وسمي h1 , لاحظ ان المتغير $in هو متغير محلي مُعرف داخل الدالة فقط ولا علاقة له مع المتغير $in خارج الدالة :
<?php
$in = 'Abd Alltif';
function f_echo($in)
{
echo "<h1>$in</h1>";
}
f_echo(10);
f_echo(12.332);
f_echo('Ahmed');
f_echo(true);
//f_echo(array(10,20,30));
?>
والكود الأخير الموجود في التعليق هو محاولة تمرير مصفوفة لطباعتها , لكن لو نفذت هذا السطر سيتم توليد خطأ , لأن الدالة تحتوي على بيانات داخلها ولا نستطيع طباعتها مباشرة .
الدالة التالية تأخذ وسيطين وتُعيد حاصل الجمع :
<?php
function sum($var1, $var2)
{
return $var1 + $var2;
}
echo sum(10, 20);
?>
كما يمكن تمرير الدوال لبعضها البعض كالتالي :
<?php
f_echo(sum(10,20));
function f_echo($in)
{
echo "<h1>$in</h1>";
}
function sum($var1,$var2)
{
return $var1+$var2;
}
?>القيم الافتراضية للوسائط :
في بعض الاحيان يكون للدوال وسائط اختيارية حيث يتم وضع قيمة افتراضية لها , فإذا لم يتم تحديد قيمة الوسيط , فسيتم اخذ القيمة الافتراضية بدلا عنه , ويجب ان تكون جميع الوسائط بعد الوسيط الافتراضي افتراضية , اي لا يجوز ان تعريف الدالة بالشكل التالي :
<?php
function function_name ($var1 = 'value', $var2)
{
}
?>مثال عن الاستخدام الصحيح :
<?php
function f_echo($in = "text")
{
echo "<h1>$in</h1>";
}
f_echo();
?>
سيتم طباعة text بسبب عدم اعطاء اي وسائط للدالة .
اعادة اكثر من قيمة من الدالة :
كما تلاحظ لا يجوز ان تعيد الدالة الواحدة اكثر من قيمة , لكن يمكن تجاوز هذه المشكلة باستخدام المصفوفات حيث يتم اعادة مصفوفة تكون عناصرها هي القيم المطلوبة :
<?php
function math($x)
{
return array($x * $x, log($x));
}
print_r(math(23));
?>تمرير الوسائط بمرجعياتها :
في بعض الاحيان , نحتاج الى تعديل قيمة الوسيط مباشرة في الدالة عوضا عن ارجاع قيمة منها واسنادها الى متغير , لجعل الوسائط تُمرر الى دالة بمرجعيتها (By Reference) يجب استخدام الرمز & قبل اسم الوسيط عند تعريف الدالة :
<?php
function sum(&$var1, $var2)
{
$value1 = $var1 + $var2;
//the same as $var1+= $var2;
}
$num1 = 10;
$num2 = 15;
echo $num1;
//outputs 10
echo '<br>';
sum($num1, $num2);
echo $num1;
//outputs 25
?>
تمرين : الدالة rand تقوم باعطاء قيمة عشوائية بين وسيطين الاول min والثاني max كالتالي :
rand(10, 30);
حيث يتم اعطاء قيمة عشوائية بين 10 و 30
* باستخدام الدالة rand قم بانشاء دالة -وليكن اسمها random- تقبل وسيطا هو مصفوفة حيث تعيد قيمة عشوائية واحدة من المصفوفة على شكل نص string بدون استخدام الدالة array_rand, مثال على استخدامها
<?php $array = array(10, 50, 30, 90); echo random($array); #prints 10 or 50 or 30 or 90 ?>
قام بكتابة النسخة الاولية من هذا الدرس الاخ ahmedsaoud31 و من ثم قمت باعادة صياغة بعض فقراته واضفت بعضها الآخر :)