التكرارت والمصفوفات
لقد اخذنا في الدرس السابق شيئاً من أساسيات البرمجة وهو الدوال الشرطية وصناعة القرارات والآن نحن نتجه إلى شي يحب جهاز الكمبيوتر عمله وهو التكرارت والمصفوفات .
في الواقع قد يكون لديك يومياً شي تفعله بشكل مستمر مثل الإفطار في الصباح الباكر والنوم مساء ، انك تستمر على هذا الروتين دائماً .... نحن نسمي هذا الشي في لغة البرمجه التكرار .
هناك شي آخر يسمي المصفوفات ... في الواقع قد يحتوي درج مكتبك الخاصة بالكتب على عدة أدراج الدرج الاول منها يحتوي على الكتب الإسلامية والدرج الثاني منها يحتوي على الكتب الرياضية والدرج الثالث يحتوي على كتب الرياضيات ... أو لنفرض أنك مدرس في إحدي المدارس ولديك جدول للحصص ففي الحصة الأولى لديك مثلاً تدريس مادة الرياضيات .... والحصة الثانية لديك تدريس مادة العلوم والثالثة لديك تدريس مادة الكيمياء .... إن حصصك مرتبة بشكل معين مع أنها كلها تسمي حصص إلا أن كل حصة تختلف عن الأخري في المادة ! وهي مرتبه بشكل تصاعدي (الحصة الاولى ، الثانية ،الثالثة .....) .
نسمي هذه التقنية بالمصفوفات .... المصفوفات عبارة عن متغير اسمه ثابت ولها اكثر من قيمة وكل قيمة لها رقم معين ولكي تحصل على القيمة فانك تكتب المتغير ثم رقم القيمة التي فيه، لايشترط أن تكون هذه القيم متسلسلة فقد يكون هناك قيمتين ولكل قيمة رقم يختلف تماماً ويبعد كل البعد عن القيمه الثانية مثال رقم 1 و 258 كلاهما مختلف تماماً ويبتعد كل البعد عن الاخر .
إن دمج ميزة التكرارات مع المصفوفات يساعدك على توفير عدد الأسطر للكود ويساعدك على صنع أشياء عجيبة في أقل عدد ممكن من الأسطر .
التكرارات
التكرارات عبارة عن تكرار أمر معين بعدد معين من المرات ولقد اخذنا سابقاً الدوال الشرطية أو العبارات الشرطية بالأصح فوجدنا أن الكود الذي نكتبه في العبارات الشرطية لا تتنفذ إلا عندما يكون الشرط صحيحاً
أيضا التكرارت فهي تختبر الشرط فإذا كانت قيمته صحيحة فإنها تقوم بعمل الكود المطلوب ثم تقوم بإعادة اختبار القيمة فإذا كان صحيحاً فإنها تقوم بإعادة تنفيذ الكود وهكذا ، أما عندما لا يكون الشرط صحيحاً فإنها تتوقف عن تنفيذ الكود ويتم اكمال البرنامج بشكل عادي ... هناك ثلاثة أنواع من التكرارات .
إن أول دالة نقوم بأخذها في البداية هي الدالة while
التكرار while
لقد قمنا بأخذ التكرار while لأنه بسيط جداً وصيغه هذا التكرار هي :
While (condition شرط (
{
code
}
مثال :
<?
$d =10 ;
while ($d<15)
{
echo “$d <br>”;
$d++;
}
?>
سيقوم الـPHP أولا بإعطاء المتغير $d القيمة 10 ثم يقوم بعد ببدء التكرار while فإذا كان الشرط صحيحاً (وهو أن المتغير أصغر من الرقم 15) فإنه يقوم بتنفيذ الكود الذي بين الأقواس وعمل هذا الكود أن يقوم بطباعة المتغير ثم يقوم بإضافة واحد على القيمة الموجودة في المتغير $d ثم بعد ذلك سيتم اختبار الشرط مرة ثانية فإذا كان صحيحاً فسيتم نفس العملية حتي يكون الشرط غير صحيح فيتوقف عندها التكرار ويتم إكمال الكود التي تقع بعد الاقواس .
إذا لم تقم بوضع حد للتكرار فلن يتوقف التكرار وقد يكون لانهائي ....
مثال :
<?
$d =10 ;
while ($d<15)
{
echo “$d <br>”;
}
?>
سيتم طباعة الرقم 10 ولن يتوقف التكرار لأن الشرط صحيح دائماً وليس هناك مايوقفه بينما في الكود السابق استطعنا إيقاف الكود بسبب أننا كنا نضيف واحد على القيمة الموجودة في المتغير وكلما يتم اعادة اختبار الكود كل ما تتغير القيمة حتي يصبح الشرط غير صحيح بسبب أن $d أكبر من 15 .
التكرار do - while
هذا التكرار يعمل بنفس طريقه التكرار الأول إلا أنه يوجد بعض الاختلافات البسيطة وصيغته كالتالى :
do
code
while (conditionشرط );
مثال :
<?
$f=15 ;
do
{
echo “$f”;
$f ++
}
while () ;
سيقوم التكرار بتنفيذ السطر الموجود بين القوسين أولا ثم يقوم بتنفيذ بإختبار الشرط فإذا كان الشرط صحيحاً قام بإعادة العملية الموجودة بين القوسين وهي إضافة واحد على المتغير $f وهكذا حتي يكون الشرط غير صحيح فيتم التوقف .. لاحظ أننا في التكرار الأول قمنا باختبار الشرط قبل صناعة أي عمل بينما في التكرار الثاني قمنا بتنفيذ الكود أولا ثم قمنا بإجراء الاختبار .
التكرار FOR
يختلف هذا التكرار عن سابقيه لكن وظيفته هي نفس وظيفتهما وهي تكرار الأوامر عند حصول شي معين
الصيغة :
For (counter عداد ; test value اختبار القيمة ; set counter اداء عمليه على العداد )
{
code شفرة
}
مثال :
<?
For ($u = 18 ; $u>10 ; $u--)
{
echo $u;
}
?>
يتكون هذا التكرار من ثلاثة أقسام .... القسم الأول نضع فيه متغير يحتوي على قيمة حيث سيبدأ التكرار العمل من عند هذه القيمة والقسم الثاني نكتب فيه الشرط الذي سيقوم التكرار بفحصه (والذي هو كالمعتاد اختبار لقيمة المتغير في القسم الاول ) والقسم الثالث نضع فيه العمل الذي سيجري على المتغير عند كل تكرار ثم نقوم بكتابة كود التي سيقوم بتنفيذها التكرار بين القوسين .
كأننا نقول للـphp بشكل عامي أن يقوم في البداية بإعطاء المتغير $u القيمة 18 وقبل ان يقوم بتنفيذ الكود عليه أن يقوم بتحليل الشرط فإذا كان الشرط صحيحاً فإنه يقوم بإنقاص واحد من المتغير $u ويتم تنفيذ الكود حتي يصبح المتغير$u قيمته 9 فيقوم الـPHP آنذاك بالخروج من التكرار والذهاب الي الكود الذي يلى القوسين .
المصفوفات
لقد قمنا بتعريف المصفوفات سابقاً بشكل بسيط وحان الوقت الآن لنعرفها ونعرف كيفية عملها . المصفوفات عبارة عن متغير وهذا المتغير يحتوي على أكثر من قيمة أو عنصر (element) وكل عنصر له فهرسة (Index) تبدأ هذه الفهرسة من الصفر إذا لم تقم بتحديدها
مثال :
<?
$A[ ] = “alfareees”;
$A[ ] = 13;
?>
في هذا المثال سيقوم الـPHP بإعطاء الفهرسة تلقائياً فسيقوم بوضع الرقم فتصبح المتغير فهرسته كالتالى :
$A[0] = “alfareees”;
$A[1] = 13;
إننا لم نقم بإدخال هذه الأرقام من تلقاء أنفسنا ولكن الـPHP قام بوضعها مع أنه يمكننا أن ندخلها بشكل عادي فمثلاً لو كتبنا :
<?
$A[0]= “alfareees”;
$A[1] = 13;
?>
سيقوم الـPHP بأخذ الفهرسة المعتمدة ولن يضع أي فهرسة أخري يمكننا أيضا أن نكتب أي فهرسة ولانعتمد على الترتيب في الارقام .
مثال :
<?
$A[10 ] = “alfareees”;
$A[ 25] = 13;
?>
هل لاحظت أيضا أننا لم نقم بتعريف نوع متغيرات المصفوفة وقام الـPHP بتعريفها تلقائياً بدلاً منا فمرة استخدمنا قيمة حرفية ومرة استخدمنا رقماُ ورغم ذلك فلم يقم الـPHP بعمل أي اعتراض إضافة إلى ذلك فإن الـPHP يقوم بتحديد عدد عناصر المصفوفة تلقائياً فهو يعرف مثلاً من المثال السابق أن عدد عناصر المصفوفة الكلي هو عنصرين .
يمنحنا الـPHP ميزة أخري وهي عدم التقيد بالأرقام في الفهرسة فمثلاً يمكننا استخدام حروف عادية .
مثال :
<?
$A[“a” ] = “alfareees”;
$A[“b” ] = 13;
?>
لاحظ أننا استخدمنا القيم الحرفية ولم يعترض الPHPJ بتاتاً ويمكننا طباعة أي عنصر من عناصر المصفوفة بكل بساطة .
مثال :
<?
$r [“aa”] = “ahmed ali”;
$r [1] = 13273;
$r [20] = 13273;
echo $r[aa];
echo $r[20];
echo $r["aa"];
?>
لا فرق بين أن نكتب النص الحرفي (aa) بين علامتي تنصيص عند الطباعه وعند كتابته بدون علامات تنصيص ... سيقوم الـPHP بمعرفة ذلك تلقائياً .
يمكننا تعريف المصفوفات أيضا بطريقة أخري
$variable = array (elements) ;
مثال :
<?
$t =array (“ahmed”, “ali”, “salem ”, “alfarsi”);
echo $t [0];
?>
يقوم الـPHP بإعطاء كل عنصر من عناصر المصفوفة رقم فهرسة فتصبح كالتالى :
Element العنصر | Index الفهرسه |
Ahmed | 0 |
Ali | 1 |
2 | |
alfarsi | 3 |
إذن القيمة التي سيطبعها الـPHP في النهايه هي ahmed ، لاحظ أن الـPHP قام بإعطاء رقم الفهرسة وقام بالبدء من الصفر ولكن يمكننا جعل الـPHP يبدأ الفهرسة من الرقم واحد كالتالي :
<?
$r = array (1=>”ahmed”, “ali”,”salem ”, “alfarsi”);
?>
عند تعريفك لرقم الفهرسة للقيمة الأولى سيقوم الـPHP بإعطاء أرقام فهرسة بشكل تسلسلي ،
عندئذ ستصبح الفهرسة كالتالى :
Element العنصر | Index الفهرسه |
ahmed | 1 |
Ali | 2 |
3 | |
alfarsi | 4 |
هناك طريقة لتكون أيضا الفهرسة هي عبارة عن حروف :
<?
$r = array (“ss”=>”ahmed”, “sf”=> “ali”, “da”=>”salem”, “bv”=> “alfarsi”);
?>
عندئذ ستصبح الفهرسة كالتالى :
Element العنصر | Index الفهرسه |
Ahmed | Ss |
Ali | Sf |
Da | |
Alfarsi | Bv |
عندما نريد تغيير أي عنصر في المصفوفة فيمكننا عمل ذلك ببساطه .
مثال :
$r [ss]= “لمياء”;
لاحظ أننا قمنا بتغيير القيمة من (ahmed) الى (لمياء) ....طريقة بسيطة أليس كذلك : )
قراءه المصفوفات واستخراج القيم
تكلمنا سابقا عن التكرار For
يمكننا استخراج عناصر مصفوفة وطباعتها في بساطة وتوفير وقت عن طريق التكرارات
لنفرض أن لديك هذه المصفوفة :
<?
$people =array (“ahmed”, “ali”, “salem ”, “alfarsi”);
?>
واردت أن تطبع أسماء جميع الاشخاص المتواجدين فيها
أولاً نحن نعرف أن المصفوفة إذا لم نقم بتعريف رقم فهرسة لها فإن الـPHP يقوم ببداية فهرستها من الصفر وعلى ذلك فان رقم العنصر الأول 0 ورقم العنصر الرابع 3 ... على ذلك يمكننا بكل بساطه كتابة الكود التالي الذي يقوم بطباعة المصفوفة كالتالى :
<?
$people =array (“ahmed”, “ali”, “salem ”, “alfarsi”);
echo “$people[0]. <br>”;
echo “$people[1]. <br>”;
echo “$people[2]. <br>”;
echo “$people[3]. <br>”;
?>
لنفرض أن لديك ثلاثين أو ثلاثة آلاف اسم في مصفوفة ألن تبدو هذه الطريقة متعبة قليلا !!!
هناك طريقة أخري وهي عن طريق التكرارات .
لنفرض أننا أردنا كتابة تكرار يقوم بطباعة الارقام من واحد الى عشرة فإننا نستطيع كتابة التكرار بالشكل التالى :
<?
For ($I=1;$I<11;$I++)
{
Echo "$I <br>";
}
?>
والآن لنقل أننا نريد طباعة الأربعة عناصر في المصفوفة كل ماعلينا هو إجراء عملية بسيطة على الكود لكي يتم ذلك :
<?
$people =array ("ahmed", "ali", "salem ", "alfarsi");
For ($I=0;$I<4;$I++)
{
Echo "$people[$I] <br>";
}
?>
لاحظ أننا بدأنا العداد بالقيمة صفر ثم اشترطنا أن يكون أقل من 4 لأن آخر عنصر في المصفوفة رقم فهرسته 3 ثم قمنا بجعله يزداد بقيمة 1 لأننا نريد طباعة جميع عناصر المصفوفة وقمنا بوضع رقم العداد في خانة الفهرسة وعلى ذلك سيتم في كل تكرار طباع عنصر المصفوفة الذي فهرسته تساوي رقم العداد .
لقد تكلمنا سابقاً في درس النماذج عن إخراج القيم من قائمة على شكل مصفوفة .
مثال :
<form action = “array.php” method = post>
ما هو مشروبك المفضل ؟
<br>
<select name = “a[]” multiple>
<option>شاي</option>
<option>قهوة</option>
<option>كابتشينو</option>
<option>توت</option>
<option>برتقال</option>
</select>
<br>
<input type=submit value = “لذيذ” >
</form>
في ملف الـarray.php اكتب :
<html>
لقد قمت باختيار التالى :
<?
For ($I=0;$I<4;$I++)
{
Echo "$a[$I] <br>";
}
?>
</html>
لقد عرضنا في القائمة خمسة عناصر ... لاحظ أننا وضعنا في اسم المتغير للقائمة قوسين [ ] لكي يتعرف الـhtml على أنه سيتم تخزين البيانات تلقائياً بعد ذلك قام الـPHP بفهرسة العناصر التي تم إرسالها من قبل العميل سواء كانت ثلاثة أو أربعة ولكنها بالطبع لن تزيد على خمسة .... على ذلك سيكون آخر رقم تنتهي به المصفوفة هو 4 .
أتوقع أنك الآن بدأت تحب المصفوفات .... يمكننا صناعة القائمة عن طريق المصفوفة أيضاً ....
مثال :
<form action = “list.php” method = post>
ما هو مشروبك المفضل ؟
<br>
<select name = “s” >
<?
$shrab =array(“شاي”,”قهوة”,”كابتشينو”,”توت”,”برتقال”);
For ($k=0;$k<4;$k++)
{
echo “<option>”.$shrab[$k].”</option>”;
}
?>
</select>
</form>
عند اختيار المستخدم للقيمة سيتم وضعها في المتغير $s يمكنك مراجعة درس النماذج لكي تفعل ذلك ، هذا المثال يقوم بصناعة مصفوفة للمشروبات ثم يقوم بإخراجها في قائمة مما يوفر علينا الوقت في كتابة الكود فلو كان لديك مثلا حوالى مئة دولة فيمكنك مثلا وضعها في مصفوفة وبعد ذلك بناء القائمة التي سوف تقوم ببناء القائمة التي ستحتوي على هذه الدول عن طريق المصفوفات والتكرارات .
قم بحفظ التغييرات في ملف إمتداده php وقم بكتابة الملف list.php اعتمادا على معلوماتك السابقة في درس النماذج .
دوال المصفوفات
الدالة key
لنفرض أن لدينا مصفوفة مكونة من عنصرين :
مثال :
$s= array (“على”,”محمد”);
الآن لنضف إليها هذه السطور
<?
$s= array (“على”,”محمد”);
$t=key ($s);
echo $t;
?>
يقوم الأمر key بإيجاد رقم الفهرسه (index) العنصر النشط حالياً .... وهو الرقم صفر حيث أننا لم نضع فهرسة وهذه هي الفهرسة التي وضعها الـPHP تلقائياً عندما لم نضع فهرسة ... قد تحيرك كلمة النشط لكن ستعرف أننا نستطيع التجول بين عناصر المصفوفة لاحقاً .
قد يكون رقم الفهرسة حروف أو كلمات
مثال :
<?
$s= array (“ع”=>“على”,”م”=>”محمد”);
$t=key ($s);
echo $t;
?>
الدالة current()
تقوم الدالة current بإيجاد القيمة لعنصر المصفوفة الحالى (index value) .
مثال :
<?
$s= array (“ع”=>“على”,”م”=>”محمد”);
$p=current ($s);
echo $p;
?>
في المثال السابق قمنا بإيجاد القيمة الحالية للعنصر النشط .... لاحظ أننا أوجدنا بالأمر key رقم الفهرسة بينما أوجدنا بالأمر current القيمة للعنصر المفهرس .
كيف يمكننا تنشيط العناصر الاخري للمصفوفه ؟!
يمكننا ذلك عن طريق الدالتين next() و prev اللتان تقومان بالتجول بين عناصر المصفوفة ..... لنفرض أن لدينا مصفوفة تتكون من ثلاثة عناصر
مثال :
<?
$s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
echo key($s).”<br>”;
echo current($s) .”<br>”;
?>
لقد قمنا في هذا المثال بطباعة قيمة رقم الفهرسة للعنصر الحالى وقيمته ( اقصد برقم الفهرسة الحرف(ع) واقصد بالقيمة (على) .... لنقم الآن بالتجول بين عناصر المصفوفة ولنر نتيجة الطباعة .
مثال :
<?
$s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
next($s);
echo key($s).”<br>”;
echo current($s) .”<br>”;
?>
<?
$s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
next($s);
next($s);
echo key($s).”<br>”;
echo current($s) .”<br>”;
?>
لاحظ أننا كتبنا الدالة next() قبل أن نقوم بالإنتقال لكي يتم تنشيط العنصر الثاني في أول مثال ولتنشيط العنصر الثالث في ثالث مثال (ولاحظ أننا كتبنا next() مرتين ) .
يمكننا الرجوع لتنشيط العنصر السابق بوضع الدالة prev() فمثلاً يمكننا تعديل المثال التالى :
<?
$s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
next($s);
next($s);
prev($s);
echo key($s).”<br>”;
echo current($s) .”<br>”;
?>
فسيقوم الـPHP في هذه الحاله طباعة العنصر الثاني وليس الثالث لأنه تم التراجع خطوه عن طريق prev()
ماذا سيحصل إذا قمنا بإضافة عنصر على مصفوفة غير محدودة الفهرسة ؟!
لنفرض أن لدينا مصفوفة وأضفنا إليها عنصر غير محدد الفهرسة . مثل :
<?
$s= array (12=>“على”,5=>”محمد”,44=>”احمد”);
$s[ ]= “هشام”;
Next($s);
Next($s);
Next($s);
Echo key ($s).”<br>”;
Echo current( $s ).”<br>”;
?>
سيقوم الـPHP ببساطة بالبحث عن أكبر رقم فهرسة وبعد ذلك يبدأ بإعطاء الفهرسة تسلسلاً بعده فإذا كانت أرقام الفهرسة حروفاً بدأ من الصفر في اعطاء الرقم .. ولاحظ في هذا المثال بأنه قام بإعطاء العنصر الرقم 45 لأن أكبر عنصر في المصفوفة هو 44 وعلى ذلك قام بإعطاء الأرقام تسلسلاً بعد هذا الرقم .
الدالة List و Each
لنفرض أنك قد قمت بصنع مصفوفة غير مفهرسة بالترتيب
مثال :
<?
$s= array (12=>“على”,5=>”محمد”,44=>”احمد”);
?>
على ذلك دعنا نخبرك بخبر سار وهو أنك تستطيع أن تجعل حياتك مع PHP أسهل مع حياتك مع نفسك !
While (list(ارقام الفهرسة Index,Element valueقيمة العنصر )=each (array)
تستطيع بواسطة هذه الدالتين وعن طريق التكرار while استخراج جميع العناصر الموجودة في المصفوفة
While (list($e,$r) = each ($s))
{
echo “<br> $e<br> $r”;
}
أولاً أنت تقوم بتسمية متغيرين واحد منهما لرقم الفهرسة ($e) والثاني للعنصر ($r) ويمكننا تسميتهما بأي اسم وفي حالة ما إذا أردنا عرض العنصر فقط أو معرفة العنصر فقط فيمكننا حذف ($e) ولكننا لانحذف الفاصلة
While (list(,$r) = each ($s))
{
echo “<br> $e<br> $r”;
}
لنعد الى المثال الذي فيه رقم الفهرسة والعنصر ... سيقوم التكرار بوضع رقم الفهرسة (الذي قد يكون نصياً) في المتغير $e وسيضع قيمة العنصر الذي رقم الفهرسة له هو $e في المتغير $r ثم سيقوم بطباعة العناصر حتي ينتهي منها جميعها ...
ملاحظة مهمة : إذا لم تقم بتعريف فهرسة للمصفوفة (حروف أو أرقام أيا كان) فسيتم استخدام العناصر عندما يطلب التكرار الفهارس .
مثال :
<?
$e=array("fsda","terhfgfd","tewr");
While (list ($I,$V)=each($e))
{
echo "<br>$e[$I]";
}
?>
لاحظ مع Hننا طلبنا طباعة الفهرسة (index) إلا أنه تم أخذ العناصر(elements) بدلاً من الفهرسة
يمكننا بواسطة هذه الدالة صناعة أشياء مفيده وكمثال لذلك لنفرض أن لدينا مصفوفة أرقام هواتف ونريد أن نخرج هذه المصفوفة على جدول html فسنستطيع صناعة هذا الجدول عن طريق التكرار السابق بكل سهولة .
مثال :
<table align='center' dir = "rtl" border="1" width="100%" cellspacing="0" bordercolorlight="#000000" bordercolordark="#000000" bordercolor="#000000">
<tr>
<td align='center'>الاسم</td>
<td align='center'>رقم التلفون</td>
</tr>
<?
$s = array (658=>"عادل" ,456546=>"سالم" , 465873);
While (list($e,$r) = each ($s))
{
echo "<tr><td align='center'>". $r . "</td><td align='center'>" .$e . "</td></tr>";
}
?>
</table>
أرايت كيف استخرجنا جميع أرقام التلفونات في جدول بواسطه تكرار بسيط ، يمكنك صناعة الأكثر واختصار الكثير من الوقت على ذلك إذا كانت المصفوفة تحتوي على المئات من الأرقام بواسطة هذا الكود بدلاً من أن تكتب الكود على شكل html وتكتب البيانات وتتعب نفسك .
يمكنك أيضا معرفة عدد العناصر في مصفوفة معينة إذا كنت تريد معرفة عددها وذلك بالطريقة التالية :
<?
$s= array (12=>“على”,5=>”محمد”,44=>”احمد”);
$S=0;
While (list($E,$r) = each ($s))
{
$S++;
}
ECHO “عدد عناصر المصفوفه ” . $S++;
?>
فرز المصفوفات
هناك العديد من الدوال التي يوفرها لنا الـPHP لفرز المصفوفات . نحن سنأخذ نظرة عن الخمسة دوال الأكثر استخداماً :
الدالة Sort()
هذه الدالة من أساسيات فرز المصفوفات وهي جداً أساسية وهي تقوم بأخذ محتويات المصفوفة ومن ثم تقوم بفرزها هجائياً اعتماداً على الأحرف الكبيرة أولا ثم الصغيرة .. تتطلب هذه الدالة اسم المصفوفة التي سيتم عليها الفرز
Sort (ArrayName);
إذا قمنا بإنشاء مصفوفة بالشكل التالى :
$NaNo=array (“ali”,“salem”,“hythem”,“Khaled”,“Ammar”,“Hesham”(;
فإذا أردنا فرزها عن طريق الدالة sort() فإننا نقوم باستخدامها كالتالى :
<?
$NaNo=array (“ali”,“salem”,“hythem”,“Khaled”,“Ammar”,“Hesham”(;
sort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo “<br> $e<br> $r”;
}
?>
لاحظ أنه عند تنفيذك للمثال ستجد أن الـPHP قام بالفرز اعتماداً على الأحرف الكبيرة أولاً ثم قام بالفرز بعدها اعتماداً على الأحرف الصغيرة .
الدالة Arsort()
هذه الدالة تعمل نفس عملية الدالة sort() ولكن هناك اختلاف بسيط فمثلاً لو كتبنا المصفوفه كالتالى :
$NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
وأردنا فرزها وطباعة الفهارس والقيم كما في المثال التالى :
<?
$NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
sort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo “<br> $e<br> $r”;
}
?>
قارن ناتج المثال السابق مع هذا المثال :
<?
$NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
asort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo “<br> $e<br> $r”;
}
?>
اعتقد انك قد عرفت الفرق ففي المثال الاول قامت الدالة sort باستبدال الحروف بأرقام في الفهرسة أما في المثال الثاني فقد تم وضع الحروف كما هي وتم فرزها كما تفعل الدالة sort في الفرز .
باختصار لايوجد فرق بين sort و asort إلا في أن الدالة sort تستبدل فهرسة الحروف بأرقام .
الدالة Rsort() و arsort
تقوم بنفس عمل sort و asort ولكن بشكل عكسي جرب الأمثلة التالية :
مثال :
<?
$NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
rsort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo “<br> $e<br> $r”;
}
?>
مثال :
<?
$NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
arsort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo “<br> $e<br> $r”;
}
?>
ستجد أن الدالة rsort تقوم بنفس عملية الدالة sort ولكن بشكل عكسي
أيضاً الدالة arsort تقوم بنفس عملية asort ولكن بشكل عكسي .
يمكنك استعمال كل هذه الدوال في الفرز مع الحروف العربية ( إذا كان السيرفر يدعم اللغة العربية )
قم بتطبيق المثال التالى :
RSORT()
<?
$NaNo=array ( "ad"=>"سالم", "kh"=> "احمد");
rsort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo "<br> $e<br> $r";
}
?>
<br>--------<br>
ARSORT()
<?
$NaNo=array ( "ad"=>"احمد", "kh"=> "أحمد");
arsort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo "<br> $e<br> $r";
}
?>
<br>--------<br>
ASORT()
<?
$NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
asort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo "<br> $e<br> $r";
}
?>
<br>--------<br>
SORT()
<?
$NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
sort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo "<br> $e<br> $r";
}
?>
الدالة ksort
تكلمنا سابقاً عن طريقة فرز المصفوفات ولكن نريد أن نلفت نظرك أننا كنا نعتمد على العنصر في الفرز (element) ولكن هذه الدالة تقوم بالاعتماد على رقم الفهرسه في الفرز (index)
مثال : sort
<br>--------<br>
asort()
<?
$NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
asort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo "<br> $e<br> $r";
}
?>
<br>--------<br>
ksort()
<?
$NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
ksort($NaNo);
While (list($e,$r) = each ($NaNo))
{
echo "<br> $e<br> $r";
}
?>
لقد اعتمد الـphp على index ولم يعتمد على الـelement في الفرز .
دوال المصفوفات الإضافيه
هناك الكثير من الدوال التي يمنحنا إياها الـPHP للتعامل مع المصفوفات والتي لايكفي الوقت لذكرها الآن سنقوم بشرح أهم دالتين والمستخدمة بكثره وهي array_push() و array_pop()
لنفرض أننا قمنا بإنشاء مصفوفة بالشكل التالى :
<?
$saher[ 5]=”salem ”;
$saher[ 85]=”khaled”;
$saher[ 35]=”mohmed”;
$saher[ 19]=”hajeer”;
?>
وأردنا أن نضيف عنصر جديد لها فقمنا بالتالى :
<?
$saher[ 5]=”salem ”;
$saher[ 85]=”khaled”;
$saher[ 35]=”mohmed”;
$saher[ 19]=”hajeer”;
$saher[ ]=”Alfarees”;
?>
انظر إلى العنصر الأخير الذي سيعطيه الـPHP رقم الفهرسة (index) وسيكون رقم فهرسته هو 86 .
نريد أن نلفت نظرك بأننا نستطيع عمل إضافة لعنصر على المصفوفة بطريقة أخري وهي عن طريق الدالة array_push() كالتالى :
array_push (ArrayNameاسم المصفوفه,Elemnt1, Elemnt2, Elemnt3,…..)
نضع في القسم الأول من الدالة اسم المصفوفة التي نريد إضافة العنصر لها ونضع في القسم الثاني عنصر واحد أو أكثر وهي التي سيتم إضافتها للمصفوفة .
مثال :
<?
$saher[ 5]=”salem ”;
$saher[ 85]=”khaled”;
$saher[ 35]=”mohmed”;
$saher[ 19]=”hajeer”;
array_push ($saher,Alfarees)
?>
مثال :
<?
$saher[ 5]=”salem ”;
$saher[ 85]=”khaled”;
$saher[ 35]=”mohmed”;
$saher[ 19]=”hajeer”;
array_push ($saher,Alfarees,salem ,sameer,thamer)
?>
ولو أردنا حذف مثلاً عنصر من المصفوفة فإننا نقوم بتعريف المصفوفة من جديد أو يمكننا استخدام الدالة array_pop التي تقوم بحذف آخر عنصر من المصفوفة والتي تتطلب فقط اسم المصفوفة
Array_pop(ArrayName اسم المصفوفه)
مثال :
<?
$saher[ 5]=”salem ”;
$saher[ 85]=”khaled”;
$saher[ 35]=”mohmed”;
$saher[ 19]=”hajeer”;
array_pop($saher)
?>
سيتم حذف العنصر hajeer من المصفوفة ولن يكون في المصفوفة غير ثلاث عناصر .
Implode و Explode
تقوم هذه الدالتين باقتصاص قيمة معينة من مصفوفة أو نصوص وتقوم بإضافة قيمة معينة على مصفوفة أو نصوص .
الدالة Implode
تقوم بإضافة قيمة على بين عناصر المصفوفة .
مثال :
<?
$stng =array ("ahmed", "salem ", "ali", "alfarsi");
$r =implode ("H",$stng);
echo $r;
?>
الدالة explode
تقوم بحذف قيمة من مصفوفة وذلك لايعني حذف عناصر من المصفوفة .
مثال :
<?
$stng =array ("ahmed", "salem ", "ali", "alfarsi");
$r =implode ("-",$stng);
echo $r;
$r= explode ("-",$stng);
echo $r;
?>
HTTP_GET_VARS و HTTP_POST_VARS
هذه ليست متغيرات بل مصفوفات ، نعم هذه مصفوفات ولكن في ماذا نستخدمها ولماذا ؟
في الواقع تحدثنا في الدرس السابق عن طريقة التعامل مع النماذج والحصول على البيانات من المستخدم وتكلمنا عن أسلوبين لنقل البيانات وهما GET و POST
عندما تصل البيانات محفوظة في متغيرات إلى صفحة الـPHP فإنه يقوم بتعريفها تلقائياً ويمكنك طباعة المتغيرات وقيمها مباشرة من غير تعريف .... ولكن هذه الميزة في الـPHP يمكن إلغاؤها عن طريق الملف PHP.INI وذلك بإغلاق ميزة register_globals
وذلك بوضع off بدلا من on
الوضع الافتراضي لها هو on ولكن تستطيع إغلاقها وقد تكون مستاجراً عند مزود خدمة ويب وسيط فيقوم بإغلاق هذه الميزة من باب الحماية ليس إلا .... لاتقلق يمكنك الحصول على البيانات فهي ما زالت موجودة ولكن يجب عليك أن تقوم بإستخدام هذه المصفوفتين لكي تستخرج البيانات .
لنفرض أنك اشتركت عند مزود ويب وكان قد أغلق ميزة (register_globals) حسناً لنفرض أنك قد صنعت نموذجاً يستخدم مربع نص ويحفظ قيمته في متغير اسمه Dorrah ثم بعد ذلك يقوم بإرسال هذه القيمة باستخدام الأسلوب GET إذاً سيكون جزء من الكود في الصفحة الأولى والتي تحتوي على النموذج كالتالى
<form method =get action = “try.php”>
ماهو اسم الطفل الذي استيقظ به العالم الاسلامي من غفلته قبل عده شهور !!
<br>
<input type=text name = “Dorrah”>
<br>
في الملف الثاني(try.php) سنقوم بكتابة الجزء الذي سيقوم بطباعة القيمة كالتالى
<?
Echo HTTP_GET_VARS[“Dorrah”];
?>
لاحظ أننا لم نستخدم $ ولكن إذا أردنا الإحتفاظ بقيمة المتغير في متغير آخر فيمكننا ذلك بشكل عادي كالتالى :
<?
$Dorrah= HTTP_GET_VARS[“Dorrah”];
?>
طريقه بسيطة .... أليس كذلك ولكن .... لنفترض أن مزود خدمة الويب لديك حريص جداً ولذلك فقد ألغي أيضا ميزة استقبال هذه القيم في المصفوفات .... يمكنه ذلك في ملف الـphp.ini في اعدادات الـtrack_vars الذي يقوم بمنع السيرفر من استخدام هذه المصفوفات (هذه الميزة يمكن إلغاؤها في php4 ) .... على ذلك انصحك بإرسال رسال تذمر وشكوي إلى مزود الخدمة لديك .. تعلن فيها أن الأمر اصبح لايحتمل .
مصفوفه متعدده الابعاد
يمكنك صناعة مصفوفات بداخل مصفوفات على حسب ماتحتاجه في معلوماتك الرياضية فقد تحتاج مثلاً إلى إنشاء أشياء معقدة (ومقلقة نفسياً) نريد أن نخبرك على أية حال أنه يمكنك صناعة المصفوفات المتعددة الأبعاد ويمكنك استخدام حتي مائة مصفوفة متداخلة ولكن يجب أن تراعي حجم الذاكرة المستخدمة في السيرفر لديك (وعلى كل حال إن استطعت أن تقوم بالتركيز في صناعة عشر مصفوفات متداخلة بدون أي مشاكل أو مرض نفسي أو .... فأنت تستحق جائزة) .
يمكننا كتابة مصفوفة متداخلة كالتالى :
<?
$mon= array (1=>array ("sharkeh al-jafali",154786) ,2 => array ("salem almazen",1257) );
while (list($personnum) =each ($mon))
{
echo ("<br>$personnum<br>");
while (list(,$phone)=each ($mon[$personnum]))
{
echo ("$phone");
}
}
?>
الشرح
هذا المثال قد يكون غامضاً جداً لكن فكرته بسيطة أولاً افترض أنك تعلم عن list..each جيداً وتعرف صيغة التكرار الذي يستخدمهما .
الآن لدينا مصفوفة تتكون من رقمين للفهرسة هذين الرقمين كل واحد منهما عنصره عبارة عن مصفوفة هذه المصفوفة تحتوي على عنصرين ( ولنتناسي أنهما يحتويان على أرقام فهرسة ) وهما اسم شخص ورقم هاتفه .
echo
في أول خطوة :
while (list($personnum) =each ($mon))
{
echo (“<br>$personnum”);
قمنا بإخراج رقم الفهرسة الأساسي للمصفوفة والذي يعتبر هو الرقم التسلسلي للاشخاص أصحاب الهواتف ومن بعد ذلك يقوم بطباعة هذا الرقم التسلسلي ويبدأ من سطر جديد .
في الخطوة الثانية :
while (list(,$phone)=each ($mon[$personnum]))
{
echo ("$phone");
}
نقوم بإخبار الـPHP بطباعة العناصر الذي تحتويها المصفوفة التى تم طباعة رقم فهرستها ، ولاحظ (,$phone) أنها تشير إلى عناصر مصفوفة وليس فهارسها لأننا تجاهلنا فهارس المصفوفة الداخلية .
لاتقلق الأمر سهل ولكنه يحتاج الى تدرب فقط ، وعليك أن تتدرب وصدقني أنني حاولت ان أبسط المثال من أجلك ... أتمني أن تكون قد فهمت .
تطبيق عملي
افتح محرر النصوص لديك واكتب الكود التالي :
<?
Echo "<form method =post action = 'exam2.php' " ;
$boy=array ("أحمد" , "خالد", "سعد","حسن");
while (list(,$Name) = each ($boy))
{
echo "ماهي السنة الدراسية لـ $Name ؟";
Echo "<select name = 'school[]'>
<option>اول ثانوي</option>
<option>ثاني ثانوي</option>
<option>ثالث ثانوي</option>
</select>";
echo "<br><br>";
echo "<input type =hidden name =boy[] value ='$Name'>";
}
echo "<input type =submit ></form>";
?>
احفظ الكود باسم exam.php
افتح محرر النصوص واكتب الكود التالي واحفظه في ملف باسم exam2.php
<html dir = "rtl">
<?
While (list($I,$V)=each($school))
{
$friendschool[] = $school[$I].$boy[$I];
}
asort ($friendschool);
While (list ($I,$V)=each($friendschool))
{
echo "<br>$boy[$I]"." ".$school[$I];
}
?>
قم بتشغيله بعد نقله لمجلد السيرفر
الشرح
الذي قمنا به في المثال السابق هو أننا قمنا بإنشاء مصفوفة لعده أشخاص ($boy) ونريد أن نعرف مرحلهم الدراسية في الثانوية فأنشأنا لكل طالب قائمة منسدلة بواسطة التكرار (list-each) بصناعة قوائم منسدلة وحقول مخفية يتم تخزين قيم الحقول (التي تحتوي على أسماء الأشخاص) في المصفوفة ($boy) وسيتم تخزين نتائج كل القوائم في مصفوفة ($school) وبعد أن يختار المستخدم الإجابات التي تناسبه وارسال البيانات سيتم استقبال المصفوفة التي فيها نتائج القوائم المنسدلة ($school) واستقبال المصفوفة التي فيها أسماء الأشخاص ($boy) ومن ثم يتم إنشاء مصفوفة جديدة باسم $friendschool[] ويؤخذ منها معلومات المصفوفتين ويتم دمجها فيها ومن ثم يتم بتكرار آخر طباعة عناصر المصفوفتين $boy و$school .
تكرار foreach
هذا التكرار هو من الأشياء الجديدة في الـphp4 وهو يساعدك على معرفة عناصر مصفوفة معينة أو طباعة محتوياتها .
Foreach ($ArrayName As $ArrayItem)
{
code شفره
}
مثال :
<?
$T= array (a=>”ahmed “ , b => “basem”, c=>”car”)
Foreach ($T As $A => $r)
{
echo $A .”-----”. $r;
}
?>
الدالة count
تقوم بحساب عدد العناصر الموجودة في المصفوفة
مثال :
<?
$c=array("a","b","c");
$v=count($c);
echo $v;
?>