استخدام المصفوفات
الجزء الأول
المصفوفة:
هي متغير يخزن
مجموعة من العناصر وكل عنصر يحمل قيمة واحدة مثل نص أو رقم أو حتى ممكن أن يكون
العنصر عبارة عن مصفوفة أخرى.
المصفوفة المتعددة الأبعاد:
هي المصفوفة
التي تحوي على مصفوفات أخرى.
تدعم لغةPHP المصفوفات المفهرسة رقمياً التي يحوي
فيها كل عنصر على فهرس رقمي، والمصفوفات الترابطية التي تختلف عن المصفوفات
المفهرسة رقمياً بأن عنصر يحتوي على كلمات أو معلومات أخرى ذات معنى تساعد عملية
الفهرسة.
تشمل الموضوعات
الرئيسية التي سوف نتعلمها في هذه المحاضرة:
·
المصفوفات المفهرسة رقمياً.
·
المصفوفات غير المفهرسة.
·
العمليات على المصفوفات.
·
المصفوفات المتعددة الأبعاد.
·
فرز المصفوفات.
·
تحميل المصفوفات من الملفات.
·
التوابع functions التي تتعلق بالمصفوفات.
مفهوم المصفوفة:
المصفوفة هي
مكان مخصص لتخزين مجموعة من القيم.
فمثلاُ في مثال
شركة بوب نستطيع وضع قائمة بمنتجات الشركة ضمن مصفوفة على الشكل التالي:
Spark Plugs
|
Oil
|
Tires
|
Products
فهذه قائمة بثلاثة
منتجات مخزنة في مصفوفة تسمى $products .
بعد وضع العناصر
في المصفوفة نستطيع القيام بالعديد من الأشياء المفيدة من خلال استخدام الحلقات looping ويمكننا حفظ العمل عن طريق
تنفيذ نفس الإجراءات على كل قيمة في المصفوفة
، كما يمكن نقل مجموعة كاملة من المعلومات كأنها عنصر واحد ، وهذا كله مع سطر واحد
من التعليمات البرمجية ، حيث يمكن تمرير جميع القيم في المصفوفة إلى تابع ما،
فمثلاً إذا كنا نريد فرز المنتجات بشكل أبجدي نمرر المصفوفة مجموعة بأكملها إلى التابع
sorting() .
تسمى القيم
المخزنة في المصفوفة عناصر المصفوفة وكل عنصر لديه فهرس مرتبط به (يُسمى أيضًا مفتاح)
يُستخدم للوصول إلى العنصر ، هذا المفتاح هو مؤشر رقمي إلى العنصر ويبدأ
عادةً من الصفر أو واحد.
تمتلك لغة PHP إمكانية استخدام مفاتيح
(مؤشرات إلى عناصر المصفوفة) من نمط string وليس فقط أرقام، هذه
المفاتيح تجعل الفهرسة أكثر فائدة في بعض الأحيان ، وسنشرح ذلك كله لاحقاً.
أولاً : المصفوفات المفهرسة رقمياً:
يتم دعم
المصفوفات المفهرسة رقمياً في معظم لغات البرمجة و في لغة PHP حيث تبدأ المفاتيح (المؤشرات) في هذه المصفوفات عند
الرقم الصفر افتراضيًا ، على الرغم من أنه يمكننا تغيير هذه القيمة.
· إنشاء المصفوفات المفهرسة رقمياً:
لإنشاء مصفوفة منتجات شركة بوب المذكورة سابقاً نكتب ما يلي:
$products = array( ‘Tires’, ‘Oil’, ‘Spark
Plugs’ );
حيث نقوم هنا بإنشاء المصفوفة $products التي تحتوي على القيم الثلاث: ‘Tires’,
‘Oil’, ‘Spark Plugs’ فكلمة مصفوفة هي كلمة ثابتة ومحجوزة مسبقاً
في لغة PHP وهي تعبر عن
متغير من نمط مصفوفة.
قد لا نحتاج دائماً إلى إنشاء مصفوفة، فربما نحتاج معلومات موجودة
مسبقاً في مصفوفة أخرى عندها نستطيع نسخ مصفوفة إلى أخرى باستخدام العملية (=) .
إذا كنا نريد مصفوفة تحوي على مجموعة أرقام متسلسلة تصاعدياً نستطيع
استخدام التابع range() لإنشاء هذه المصفوفة بشكل أوتوماتيكي على الشكل
التالي:
$numbers = range(1,10);
أيضاً باستخدام التابع range() يمكن
تحديد الخطوة بين قيم المصفوفة لأن هذا التابع لديه وسيط ثالث اختياري يتيح ذلك ، فمثلاً إذا
كنا نريد مصفوفة بالأرقام الفردية فقط نكتب :
$odds = range(1, 10, 2);
يمكن أيضًا استخدام الدالة range () مع الأحرف ، كما في هذا المثال التالي:
$letters = range(‘a’, ‘z’);
· الوصول إلى محتويات المصفوفة المفهرسة رقمياً:
بشكل عام نستطيع الوصول إلى محتويات متغير ما من خلال اسمه ، أما إذا
كان المتغير عبارة عن مصفوفة فحتى نصل إلى محتويات عنصر ما نحتاج إلى كل من اسم
المصفوفة والمفتاح أو الفهرس ، لأن هذا المفتاح أو الفهرس يشير إلى القيم الموجودة
في المصفوفة ، حيث نضع اسم المصفوفة وإلى جانبه المفتاح بين قوسي مربع على الشكل
التالي:
$products[0] , $products[1] , $products[2]
فالعنصر صفر هو العنصر الأول في المصفوفة وهذا بشكل افتراضي.
وكما هو الحال مع المتغيرات الأخرى ، يمكننا تغيير محتويات عناصر المصفوفة
باستخدام عملية الاسناد (=) على الشكل التالي :
$products[0] = ‘Fuses’;
في هذا السطر يتم استبدال العنصر الأول في المصفوفة بالقيمة 'Fuses'
كما يمكننا إضافة عنصر جديد إلى نهاية مصفوفة على الشكل التالي:
$products[3] = ‘Fuses’;
في هذا السطر قمنا بإضافة عنصر رابع للمصفوفة products باعتبار أن العدد الكلي
لعناصرها هو 3.
يمكننا أيضاّ طباعة محتويات المصفوفة على الشكل التالي:
echo “$products[0] $products[1] $products[2] $products[3]”;
لا تحتاج المصفوفات إلى التهيئة أو الإنشاء مسبقًا في PHP
حيث يتم إنشاؤها تلقائيًا في أول مرة تستخدم
فيها.
فهذا
الكود:
$products = array( ‘Tires’, ‘Oil’, ‘Spark
Plugs’ );
مكافئ
للكود التالي:
$products[0] = ‘Tires’;
$products[1] = ‘Oil’;
$products[2] = ‘Spark Plugs’;
ففي الكود الثاني يتم إنشاء مصفوفة منتجات أيضاً كما في الكود الأول
، الفرق فقط أن الكود الأول ينشئ مصفوفة بثلاث عناصر دفعة واحدة ، أما الكود
الثاني ينشئ المصفوفة عنصر عنصر ، ففي السطر الأول يتم إنشاء مصفوفة بعنصر واحد
فقط ، وفي السطر الثاني يتم إضافة عنصر آخر
إلى المصفوفة ،وهكذا....
هذه القدرة على تغيير حجم المصفوفة غير موجودة في معظم لغات البرمجة الأخرى.
· استخدام الحلقات للوصول إلى محتويات المصفوفة المفهرسة رقمياً:
بما أن المصفوفة تكون مفهرسة بواسطة سلسلة من الأرقام ، يمكننا
استخدام حلقة for
لعرض محتوياتها على الشكل التالي:
for ($i = 0; $i<3; $i++)
{
echo $products[$i]."
";
}
يمكننا أيضا استخدام حلقة foreach المصممة خصيصا للاستخدام مع المصفوفات كما في المثال التالي:
foreach ($products as $current)
{
echo $current."
";
}
هذا الكود يخزين كل عنصر بدوره في المتغير $current ويطبعه.
ثانياً : المصفوفات غير المفهرسة:
في مصفوفة
المنتجات السابقة ، ربطنا كل عنصر بالفهرس الافتراضي ، هذا يعني أن
العنصر الأول في المصفوفة هو العنصر 0 والعنصر الثاني هو العنصر 1 وهكذا ..
هناك طريقة أخرى في لغة PHP يمكننا من خلالها ربط أي مفتاح أو فهرس نريده بعنصر
من المصفوفة.
· إنشاء المصفوفات غير المفهرسة:
الكود التالي سوف ينشئ مصفوفة من أسماء المنتجات كمفاتيح والأسعار
كقيم على الشكل التالي:
$prices = array (‘Tires’=>100 , ‘Oil’=>10 , ‘Spark Plugs’=>4) ;
كما يمكننا إنشاء المصفوفة غير المفهرسة بطريقة أخرى على الشكل
التالي:
$prices = array
(
‘Tires’=>100 );
$prices[‘Oil’] = 10;
$prices[‘Spark Plugs’] = 4;
الفرق بين الطريقتين أيضاً هو أن الطريقة الأولى تنشئ مصفوفة بثلاث
عناصر دفعة واحدة ، أما الطريقة الثانية تنشئ مصفوفة بعنصر واحد أولاً ثم تضيف
عناصر أخرى إليها.
أيضاَ يمكن كتابة الكود السابق على الشكل التالي:
$prices[‘Tires’] = 100;
$prices[‘Oil’] = 10;
$prices[‘Spark Plugs’] = 4;
· الوصول إلى محتويات المصفوفة غير المفهرسة:
كما في المصفوفات المفهرسة يمكننا الوصول إلى عناصر مصفوفة غير
مفهرسة من خلال اسم المصفوفة والمفتاح على الشكل التالي:
$prices[‘Tires’]
,
$prices[‘Oil’] , $prices[‘Spark Plugs’].
· استخدام الحلقات للوصول إلى محتويات المصفوفة غير المفهرسة:
بما أن المفاتيح أو المؤشرات في المصفوفات غير المفهرسة ليست أرقامًا
، لا يمكننا استخدام عداد بسيط في الحلقة للوصول إلى عناصر المصفوفة ، ومع
ذلك يمكننا استخدام حلقة foreach أو list() أو each() .
-
استخدام حلقة foreach :
تحتوي حلقة foreach على بنية مختلفة قليلاً عند استخدام
المصفوفات غير المفهرسة على الشكل التالي:
foreach ($prices as $key => $value)
{
echo $key." –
".$value."<br />";
}
-
استخدام التابع each() :
يتم استخدام التابع each() على الشكل التالي:
while ($element = each($prices))
{
echo $element['key'];
echo " – ";
echo $element['value'];
echo "<br />";
}
حيث تكون نتيجة هذا الكود على الشكل التالي:
حيث يعيد لنا التابع each()
مصفوفة جديدة $element تحوي العنصر الحالي من المصفوفة $prices ، ثم يجعل العنصر التالي من $prices
هو العنصر الحالي (إزاحة
المؤشر) ، وبما أن التابع موجود ضمن حلقة while
يستمر في عمله حتى يصل إلى نهاية المصفوفة.
نلاحظ في هذا الكود أن المتغير $element يمثل المصفوفة التي نريد طباعتها ، والرمز key هو مؤشر للعنصر الحالي ، و الرمز value هو قيمة العنصر الحالي.
-
استخدام التابع list() :
يمكننا كتابة الكود السابق بطريقة أكثر أناقة باستخدام التابع list() الذي يقوم بتقسيم
المصفوفة إلى عدد من القيم على الشكل التالي:
reset($prices);
while (list($product, $price) =
each($prices))
{
echo
"$product - $price<br />";
}
السطر الأول في هذا الكود يقوم بإعادة المؤشر إلى بداية المصفوفة $prices
، لأنه عند استخدام التابع each() يبقى مؤشر المصفوفة عند العنصر الحالي الذي
وصلنا إليه.
يقوم التابع list() هنا بأخذ المصفوفة التي
تم إعادتها من التابع each()
ويحول العنصرين (0,1) فيها إلى متغيرين جديدين هما $price $product , ، حيث
يسمح لنا هذا التابع بإعطاء أسماء جديدة للمتغيرات.
ثالثاً : العمليات على المصفوفات:
·
عملية الدمج :
ولها الرمز (+) وتكتب على
الشكل : $a + $b حيث $a و $b عبارة عن مصفوفات وتقوم عملية الدمج بإلحاق المصفوفة $b إلى نهاية المصفوفة $a ، لكن دون إضافة التضارب في المفاتيح حال وجوده ، أي في حال وجود
عناصر ضمن المصفوفة $b لها نفس
مفاتيح عناصر المصفوفة $a لا تتم
إضافة هذه العناصر ، أي عملية الدمج لا تتضمن الاستبدال.
·
عملية المساواة :
ولها الرمز (==) وتكتب على
الشكل : $b == $a حيث $a و $b عبارة عن مصفوفات وتقوم عملية المساواة بإعادة النتيجة true في
حال كانت المصفوفتان تحويان نفس العناصر.
·
عملية التكافؤ:
ولها الرمز (===) وتكتب على
الشكل : $a === $b حيث $a و $b عبارة عن
مصفوفات وتقوم عملية التكافؤ بإعادة النتيجة true في
حال كانت المصفوفتان تحويان نفس العناصر ومن نفس النمط وبنفس الترتيب.
·
عملية عدم المساواة
:
ولها الرمز (=!)
وتكتب على الشكل : $b != $a حيث $a و $b عبارة عن مصفوفات وتقوم عملية عدم المساواة بإعادة النتيجة true في
حال كانت المصفوفتان لا تحويان نفس العناصر.
·
عملية عدم المساواة
:
ولها الرمز (<>) وتكتب على
الشكل : $b <> $a حيث $a و $b عبارة عن
مصفوفات وهي مشابهة تماماً للعملية (=!) .
·
عملية عدم التكافؤ:
ولها الرمز (==!)
وتكتب على الشكل : $a !== $b حيث $a و $b عبارة عن
مصفوفات وتقوم عملية التكافؤ بإعادة النتيجة true في
حال كانت المصفوفتان لا تحويان نفس العناصر ولا من نفس النمط ولا بنفس الترتيب.
رابعاً : المصفوفات المتعددة الأبعاد:
· المصفوفات الثنائية البعد:
قد لا تكون المصفوفات عبارة عن مجموعة بسيطة من المفاتيح والقيم ،
ربما يكون كل عناصر في المصفوفة هو مصفوفة أخرى بحد ذاته ، وهذا ما يسمى المصفوفات
الثنائية الأبعاد.
فمثلاً إذا كنا نريد تخزين عدة مواصفات لكل منتج من منتجات شركة بوب فنحن
بحاجة إلى مصفوفة ثنائية الأبعاد حيث يمثل
كل صف في هذه المصفوفة منتجًا فرديًا ويمثل كل عمود صفة من صفات المنتج على الشكل التالي:
Price
|
Description
|
Code
|
100
|
Tires
|
TIR
|
10
|
Oil
|
OIL
|
4
|
Spark
Plugs
|
SPK
|
باستخدام لغة PHP يمكننا
كتابة التعليمات البرمجية لإنشاء المصفوفة الذكورة أعلاه على الشكل التالي:
$products = array
( array(
‘TIR’, ‘Tires’, 100 ),
array ( ‘OIL’, ‘Oil’, 10 ),
array ( ‘SPK’, ‘Spark Plugs’, 4 ) );
من خلال هذا التعريف نجد أن مصفوفة المنتجات أصبحت تحتوي الآن على
ثلاثة مصفوفات.
حتى نصل إلى عنصر من عناصر مصفوفة أحادية البعد ، نحتاج إلى اسم
المصفوفة و مفتاح العنصر، وهذا مشابه للمصفوفات الثنائية البعد إلا أن الفرق هنا
أن كل عنصر يحوي مفتاحين (مؤشرين) واحد للصف وآخر للعمود وبشكل افتراضي فإن الصف
العلوي هو الصف رقم (0) والعمود في أقصى اليسار هو العمود رقم (0).
لعرض محتويات المصفوفة السابقة نكتب:
echo
‘|’.$products[0][0].’|’.$products[0][1].’|’.$products[0][2].’|<br />’;
echo ‘|’.$products[1][0].’|’.$products[1][1].’|’.$products[1][2].’|<br
/>’;
echo
‘|’.$products[2][0].’|’.$products[2][1].’|’.$products[2][2].’|<br />’;
بدلاً من ذلك يمكننا وضع حلقة داخل حلقة أخرى لنعطي النتيجة نفسها ،
وذلك على الشكل التالي:
for ($row = 0; $row < 3; $row++)
{
for ($column = 0; $column
< 3; $column++)
{
echo
'|'.$products[$row][$column];
}
echo '|<br />';
}
التعليمات البرمجية السابقة تعطي النتيجة التالية على المتصفح:
|TIR|Tires|100|
|OIL|Oil|10|
|SPK|Spark Plugs|4|
قد نفضل إنشاء أسماء للأعمدة بدلاً من الأرقام على الشكل التالي:
$products =
array
( array ( ‘Code’ => ‘TIR’,
‘Description’ => ‘Tires’,
‘Price’ => 100
),
array ( ‘Code’ => ‘OIL’,
‘Description’ => ‘Oil’,
‘Price’ => 10
),
array ( ‘Code’ => ‘SPK’,
‘Description’ => ‘Spark
Plugs’,
‘Price’ =>4
)
);
من السهل التعامل مع هذه المصفوفة إذا كنا نريد استرداد قيمة واحدة
من المصفوفة ، لأن تذكر الأسماء مفيد أكثر من تذكر الأرقام عند الرجوع إلى موقع ما
في المصفوفة الثنائية البعد ، لكن استخدام الأسماء يفقدنا القدرة على استخدام
الحلقات البسيطة للدخول إلى عناصر المصفوفة ، وبالتالي يوجد طريقة واحدة هنا لعرض
محتويات المصفوفة على الشكل التالي:
for ( $row = 0; $row < 3; $row++)
{
echo
‘|’.$products[$row][‘Code’].’|’.$products[$row][‘Description’].
‘|’.$products[$row][‘Price’].’|<br
/>’;
}
في حال أردنا استخدام التوابع each() , list ()
نحتاج إلى حلقة while
داخل حلقة for على الشكل التالي:
for ( $row = 0; $row < 3; $row++)
{
while ( list ( $key, $value ) = each( $products[$row]
) )
{
echo “|$value”;
}
echo ‘|<br />’;
}
· المصفوفات الثلاثية البعد:
ذكرنا سابقاً أن العناصر في المصفوفة يمكن أن تكون مصفوفات أيضاً
ووصلنا بهذا إلى المصفوفات الثنائية البعد، كذلك العناصر في هذه المصفوفات
الداخلية قد تكون أيضاً مصفوفات وبهذا نصل إلى المصفوفات الثلاثية البعد.
فمثلاً في شركة بوب ، إذا قسم بوب منتجاته إلى فئات ، نحتاج إلى
مصفوفة ثلاثية البعد لتخزين هذه المنتجات كما في الشكل التالي:
باستخدام لغة PHP يمكننا كتابة التعليمات البرمجية لإنشاء
المصفوفة الذكورة أعلاه على الشكل التالي:
$categories = array ( array ( array ( ‘CAR_TIR’, ‘Tires’, 100 ),
array(
‘CAR_OIL’, ‘Oil’, 10 ),
array( ‘CAR_SPK’, ‘Spark Plugs’, 4 )
),
array ( array( ‘VAN_TIR’, ‘Tires’, 120 ),
array( ‘VAN_OIL’, ‘Oil’, 12 ),
array( ‘VAN_SPK’, ‘Spark Plugs’, 5 )
),
array (
array( ‘TRK_TIR’, ‘Tires’, 150 ),
array( ‘TRK_OIL’, ‘Oil’, 15 ),
array( ‘TRK_SPK’, ‘Spark Plugs’, 6 )
)
);
وبما أن الفهارس في هذه المصفوفة هي أرقام نستطيع كتابة حلقات for متداخلة لعرض محتوياتها:
for ($layer = 0; $layer < 3; $layer++)
{
echo "Layer
$layer<br />";
for ($row = 0; $row < 3;
$row++)
{
for ($column = 0; $column
< 3; $column++)
{
echo
'|'.$categories[$layer][$row][$column];
}
echo '|<br />';
}
}
نظرًا للطريقة التي يتم بها إنشاء المصفوفات متعددة الأبعاد ، يمكنك
إنشاء مصفوفات بأربعة أو خمسة أو ستة
أبعاد وبشكل عام لا يوجد حد لعدد الأبعاد ، لكن من الصعب على الناس تصور التركيبات
بأكثر من ثلاثة أبعاد ، فمعظم المشكلات في العالم الحقيقي ينم حلها منطقيا مع
بنيات من ثلاثة أبعاد أو أقل.
تعليقات: 0
إرسال تعليق