المصفوفات Arrays في لغة PHP - ProgrammerTech
Language:

Search

المصفوفات Arrays في لغة PHP

  • Share this:
المصفوفات Arrays في لغة PHP

المصفوفات Array

المصفوفات ( arrays ) هي عبارة عن وسيلة لتخزين البيانات من نوع واحد بشكل مؤقت و الغرض من إستخدام المصفوفات هو تخزين البيانات, و يمكن للـ array list أن تحتوي على مجموعة عناصر من نوع بيانات واحد أو اكثر. و تكون البيانات في المصفوفة ضمن أقواس مربعة [].

وتعرف أيضاً على انها تقنية أو أداة لخزن البيانات من نوع واحد بشكل مؤقت وهي مقسمة لعدة خلايا وكل خلية لها عنوان index لذلك يسهب علينا معالجة البيانات وترتيبها وفرزها والبحث فيها بإستخدام المصفوفات.

توضيح للأمر اكثر (تصور قائمة من الكلمات فصلنا بينهم بإستخدام فاصلة تسمى القائمة المفصولة بفواصل). وستكون بالشكل

kaissar , data , spider , Ali , Lana , Ahmed

هذه هي الفكرة وتذكر عندما تحدثت معك في الأعلى, هي مجموعة من العناصر يكون لكل عنصر إسم ورقم خاص به. دور المصفوفات Arrays هي إعطاء كل إسم من تلك الأسماء رقم وتعريف حتى استطيع أن استخدمها في السكربت.

قبل البدء هل تعرف وظيفة المصفوفات؟

تخيل معي أن تقوم ببناء برنامج و ذلك البرنامج يحتوي على مجموعة كبيرة من الموظفين في شركة.

هل ستقوم بوضع كل إسم داخل متغير؟

ممكن أن يكون عدد الموظفين اكثر من 1000 ماذا تفعل هنا؟

الجواب: عليك بإستخدام المصفوفات.

وتقسم المصفوفات في لغة php إلى ثلاث أقسام

  1. المصفوفات المفهرسة indexed Array.
  2. المصفوفات المترابطة Associative Array.
  3. المصفوفات متعددة الأبعاد Multidiminsional Array

 

المصفوفة المفهرسة indexed Array

مصفوفة ( indexed Array ) عبارة عن مصفوفة تحتوي على مجموعة من المفاتيح العددية (numeric index) و إن كل مفتاح عددي من هذه المفاتيح يحتوي على قيمة مخزنة.

مثال

اكتب برنامج يقوم بتعريف لغات البرمجة الخاصة في websit بداخل مصفوفة.

<?php
    $lng = array("html" , "html5" , "css" , "css3" , "js" , "php"); 
    print_r($lng);
?>

إستخدمت متغير lng و داخل المتغير توجد مصفوفة Array اي أنها الدالة المسؤولة عن طباعة المصفوفات. من نوع indexed array, ثم تقوم بإدخال الـ index الذي نريده بين الاقواس. و الصورة العامة لكتابة مصفوفة من نوع indexed array تكون بالشكل

$name = array(Element , Element , Element);

الدالة الثانية print_r هي الدالة المسؤولة عن طباعة البيانات داخل المصفوفة. ليس مثل echo هي تقوم بطباعة كل محتويات المصفوفة من حيث الأسم ورقم التعريف الخاص بكل index. ويبدء من الصفر إلى لا نهاية وسيكون الناتج في السيرفر بالشكل.

Array ( [0] => html [1] => html5 [2] => css [3] => css3 [4] => js [5] => php )

ويمكن إستخدام الوسم <pre > لسطر للأسفل لكل اندكس.

<?php
    $lng = array("html" , "html5" , "css" , "css3" , "js" , "php"); 
    echo "<pre>";
    print_r($lng);
    echo "<pre>";
?>

الناتج في السيرفر

<pre>Array
(
    [0] => html
    [1] => html5
    [2] => css
    [3] => css3
    [4] => js
    [5] => php
)
pre

الآن أحدكم سوف يقول: أنت قلت بأن المصفوفات هي مجموعة من العناصر حيث كل عنصر له تعريف و رقم. كيف ننادي على احد الأندكس الداخلي من خلال الرقم, على طبيعة الحال الأندكس الذي يملك الإسم html له رقم. إذا كنت تُريد طباعة عنصر من خلال الرقم عليك إستخدام الدالة echo بدل من print_r هي الدالة مسؤولة. فقط عن طباعة محتويات المصفوفة بالكامل وليس عنصر داخله و إذا كنت تريد طباعة عنصر من خلال الرقم عليك بإستخدام.

echo $lng[0]

تقوم بجلب رقم العنصر و تضعه داخل الأقواس بعد المتغير. لكن الآن هذه المصفوفة ليست ذكية, و نريد التطوير اكثر من ذلك, ممكن أن يكون هناك مصفوفة داخل مصفوفة.

<?php
    $lng = array("html" , "html5" , "css" , array("font", "size") , "js" , "php"); 
    echo "<pre>";
    print_r($lng);
    echo "<pre>";
?>

لآحظ كيف تم كتابة المصفوفة داخل مصفوفة و يستخدم هذا النوع من المصفوفات لذكر شيئ داخل عنصر. على سبيل المثال العنصر css3 يكون به font,size و هما الخط و الحجم و سيكون في السيرفر بالشكل.

<pre>Array
(
    [0] => html
    [1] => html5
    [2] => css
    [3] => Array
        (
            [0] => font
            [1] => size
        )
    [4] => js
    [5] => php
)
<pre>

لاحظ كيف كان الناتج في المتصفح بأن يقول لك بأن النوع الثالث من هذا الأندكس هو مصفوفة و كل عناصره مثل size , font و أيضاً له ارقام لكل عنصر.

 

كيف نقوم بطباعة عنصر font؟
<?php
    $lng = array("html" , "html5" , "css" , array("font", "size"), "js" , "php"); 
    echo $lng[3][0];
?>

فقط نكتب ارقام العناصر بالترتيب داخل الأقواس. نحن نعرف بأن array الداخلية هي احد العناصر و لها رقم وهو 3 و تمتلك مجموعة. من العناصر داخلية ايضاً مثل font و رقمها 0 و يتم الطباعة عبر echo $lng[3][0]. الآن المصفوفة ليست ذكية دعونا نطور الأمر اكثر و نستخدم الحلقات for في المصفوفة.

<?php
    $lng = array("html", "html5", "css",array("font" , "size") , "js" , "php" );
    echo "<ul>";
    for ($i= 0; $i< count($lng) ;$i++)
    {
        echo "<ul>";
        echo "<li>" . $i . "</li>";
    }
?>

لآحظ قمنا بإنشاء loop حتى يتم طبع عدد العناصر الموجودة في المصفوفة array و إستخدمنا معها الدالة count. نقول هنا المتغير i=0 ثم نقول المتغير i<count للمتغير lng ثم i++ نقول هنا تزداد قيمة. اي كل مرة لحين تصل إلى عدد العناصر الموجودة في array و سيكون الناتج ارقام العناصر فقط. إذا كنت تُريد طبع عنصر معين عليك بكتابة رقم العنصر echo $lng[2] و إذا كنت تريد طباعة اسماء العناصر. داخل اللوب ما عليك فقط كتابة إسم المتغير الذي يحوي بيانات المصفوفة في دالة الطبع بالشكل.

<?php
    $lng = array("html" , "html5" , "css" , "css3" , "js" , "php"); 
    echo "<ul>";
    for ($i= 0; $i< count($lng) ;$i++)
    {
        echo "</ul>";
        echo "<li>" . $lng[$i]. "</li>";
    }
?>

وسوف يكون الناتج داخل قائمة غير مرتبة ul كالتالي.

  • html
  • css
  • php
  • javascript

 

المصفوفة المترابطة Associative

مصفوفة ( Associative Array ) هذا النوع من المصفوفات يأخذ مفتاح و قيمة أي انها key : value. النوع الأول هو indexed array يتم فقط تحديد القيمة value فقط و بناءً على ذلك يتم تحديد المفتاح., لكن في ذلك النوع يتم إعطاء قيمة للمفتاح او اسم لكن يجب أن يكون من نوع ارقام int او نصوص string.

مثال

لنفترض أنك طالب تدرس في جامعة القاهرة في مجال البرمجة وتأخذ مجموعة من اللغات وتريد أن يتم تحديد مستواك في كل لغة.

<?php
    $langs = array
    (
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
     );
?>

قمنا بإنشاء مصفوفة تحتوي على بعض اللغات التي يقدمها هذا الموقع مع تحديد نسبة مستواك لكل لغة. في البداية تحدثنا بأن هذا النوع من المصفوفات يكون له مفتاح و قيمة و ذلك المفتاح هو أسماء اللغات التي تتعلمها في هذا الموقع. أما بالنسبة للقيمة هذه نسبة تعليمك و مستواك لكل لغة.

<?php
    $langs = array
    (
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
     );
    foreach ($langs as  $kaissar)
    {
        echo   $kaissar ;
    };
?>

قمنا بإنشاء foreach لتقوم بعمل دوران على القيم الموجودة داخل Array. ثم قمنا بإنشاء متغير بإسم kaissar الذي سوف يبحث في ما يحتويه. المتغير langs ثم سيقوم بطباعة الدوران وسيكون الناتج على السرفر.

50%60%30%70%80%

لكن الآن الصورة ليست جيدة دعونا نقوم بطباعة الإخراج داخل قائمة غير مرتبه وسيكون الكود. او الشفرة البرمجية بذلك الشكل.

<?php
    $langs = array
    (
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
     );
     echo "<ul>";
    foreach ($langs as  $kaissar)
    {
        echo "<li>" . $kaissar ."</li>";
    };
    echo "<ul>";
?>

عند التشغيل سيكون الناتج في السيرفر بالشكل

  • 50%
  • 60%
  • 30%
  • 70%
  • 80%

لكن الآن foreach قامت بطبع القيمة فقط ولم اعرف ما هي العناصر الذي تحتوي .على تلك القيمة لنقوم بتطوير الكود ليقوم بطبع العنصر والقيمة الذي يحملها.

<?php
    $langs = array
    (
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
     );
     echo "<ul>";
    foreach ($langs as $programmer =>  $kaissar)
    {
        echo "<li>" . $kaissar ." => ".$programmer . "</li>";
    };
    echo "<ul>";
?>

قمنا بإستخدام foreach لتقوم بعمل دوران على القيمة و المفتاح value and key هذا ما تفعله foreach . عن الدوران الأخرى لأنها تحتوي على قيمة و مفتاح. قمنا بإنشاء متغير بإسم programmer ليبحث داخل العنصر في المصفوفة وكما قمنا بإنشاء متغير آخر. بإسم kaissar ليبحث داخل القيمة وسيكون الناتج على السيرفر بالشكل.

  • 50%  =>html5
  • 60%  =>css
  • 30%  =>javascript
  • 70%  =>php
  • 80%  =>python

الآن السؤال هنا كيف يمكنني إضافة عنصر جديد؟ يمكنك إضافة العنصر الجديد بذلك الشكل

<?php
    $langs = array
    (
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
     );
     $langs{"mysql"}="88%";
     echo "<ul>";
    foreach ($langs as $programmer =>  $kaissar)
    {
        echo "<li>" . $kaissar ." => ".$programmer . "</li>";
    };
    echo "<ul>";
?>

قمنا بإضافة عنصر جديد بإسم mysql + القيمة 88% لكن لآحظ كيف قمنا بإسناد قيمة او عنصر داخل المتغير lange من خلال الأقواس. نقول للمفسر الخاص في php قم بإنشاء او بإسناد قيمة على محتويات او قيم المتغير lange من نوع array. ويفهم هنا المفسر أن هذا نوع من انواع البيانات من array لكن لآحظ معي قمت داخل. الأقواس بتسمية العنصر الذي هو mysql وسيكون الناتج على السيرفر بالشكل.

  • 50%  =>html5
  • 60%  =>css
  • 30%  =>javascript
  • 70%  =>php
  • 80%  =>python
  • 88% =>mysql

لكن ماذا اذا لم اضع اسم العنصر داخل الأقواس. هنا سيفهم المفسر ان هذا النوع من البيانات هو array لكن. من نوع indexed array وسيتم إضافة اسم العنصر بالترتيب من 0 إلى & دعونا نفعل ذلك الآن.

<?php
    $langs = array
    (
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
    );
     $langs[]="88%";
     $langs[]="78%";
     $langs[]="84%";
     echo "<ul>";
    foreach ($langs as $programmer =>  $kaissar)
    {
        echo "<li>" . $kaissar ." => ".$programmer . "</li>";
    };
    echo "<ul>";
?>

سوف يفهم الآن المفسر أن هذا النوع من البيانات هو array indexed وسيقوم بتسمية العناصر لوحده. وسيكون الناتج في السيرفر بالشكل.

  • 50%  =>html5
  • 60%  =>css
  • 30%  =>javascript
  • 70%  =>php
  • 80%  =>python
  • 88% =>0
  • 78% =>1
  • 84% =>2

نأتي الآن إلى انواع البيانات الأخرى الذي يمكن إضافتها داخل المصفوفة. وهي null وتعني قيمة فارغة و True وتعني 1 false وتعني 0 وسيكون المثال بذلك الشكل.

<?php
    $langs = array
    (
         null     =>   "53",
         true     =>    "54",
         false    =>   "55",
        "html5"                 => "50%",
        "css3"                    => "60%",
        "javascript"           => "30%",
        "php"                     => "70%",
        "python"                => "80%",
    );
     echo "<ul>";
    foreach ($langs as $programmer =>  $kaissar)
    {
        echo "<li>" . $kaissar ." => ".$programmer . "</li>";
    };
    echo "<ul>";
?>

 

المصفوفة متعددة الأبعاد Multidimensional

مصفوفة ( Multidiminsional Array ) هي عبارة عن مصفوفة يمكننا إنشاء بداخلها مجموعة من المصفوفات مثل Indexed Array and Associative Array.

في المصفوفتين الأوليتين حيث كانت كل واحدة منهم مختصة بشيئ, كان يمكن إنشاء مصفوفه داخلها مصفوفه من indexed Array وكذلك الأمر كان ينفع مع النوع الثاني و هو Assocarive Array, وكان لا يمكن أن يحدث العكس وهو الذي داخل indexed Array داخل Assocative Array. لكن يمكن أن يحدث هذا مع Array Multidimensional لنأخذ بعض الأمثلة على هذا النوع و نتعرف كيف يعمل.

الصيغة العامة لكتابة مصفوفة متعددة الأبعاد

[3] Array Multidimensional
    Syntax :
    array(
        array( Element , Element , Element),
        array( Element , Element , Element ),
        array( Element , Element , Element ),
        );

 

مثال
<?php
$Array = array(
    array("Python" , "Java" , "C#"),
    array("html", "html5", "css3"),
    array("Java network", "python network", "c#network"),
    array("html index", "html5 index", "css3 style index.1.2"),
    array("python information security", "java information security", "c# information security"),
    );
    echo "<pre>";
    print_r($Array);
    echo "</pre>";
?>

قمنا بإنشاء مصفوفة داخل متغير بإسم Array و بها مجموعة من المصفوفات الفرعية بداخلها. لنفرض أن المصفوفة ستكون الدورات الذي سيقدمها موقعنا خلال الأيام الخمس القادمة. تحمل المصفوفة الفرعية رقم 0 اللغات التي سوف نقدمها في اليوم الأول و هي #Python And Java And C.

في اليوم الثاني سنقدم اللغات Html And Html5 And Css3 ثم سيستخدم الموقع تلك اللغات المذكورة في المصفوفة. رقم 0 في الشبكات و سيتم إستخدام python في الشبكات وكذلك java و #C. اظن انكم فهمتوا الطريقة, لآحظوا عند طبع جميع محتويات المصفوفة الرئيسية. و كما نعرف أنها بإسم Array و بإستخدام print_r يمكن طبع المصفوفة.

مصفوفة رئيسية تحمل مجموعة من المصفوفات الفرعية, كما يمكن طبع شيئ معين من داخل المصفوفات الفرعية لأن كل مصفوفة فرعية لها رقم. لنفترض أننا نريد طبع دورة html index الموجودة داخل المصفوفة الفرعية رقم 3 و html index عنصر رقم 0 كما تشاهدوا في الصورة.

يمكن الطباعة من خلال الكود [echo $Array[3][0, لآحظوا تحدثوا مع الكود بالضبط كأنكم تتحدثون مع أحد اصدقائكم. قلت له إطبع من داخل المصفوفة الرئيسية المصفوفة الفرعية التي رقمها 3 و من داخل المصفوفة الفرعية إطبع العنصر رقم 0 الذي هو html index. لكن إلى الآن المثال لم يكن معقد هذا فقط مصفوفة داخل مصفوفة, لنقوم بتعقيد المثال اكثر من خلال مثال آخر.

مثال

لنفترض على سبيل المثال الدورات المذكورة داخل المصفوفة الفرعية رقم 3 الذي بها html index و html5 index و css3 style index.1.2. و نريد أن نذكر فريق العمل الذي يعمل على تلك الدورات داخل مصفوفة بها مجموعة من المصفوفات الفرعية.

يعني سيكون مصفوفة فرعية داخل مصفوفه فرعية اخرى و ستكون تلك المصفوفة لها صلاحيات. معينة عن المصفوفات الفرعية الذي بداخلها. و سيكون فريق العمل الذي يقدم تلك الدورات هم Ali و Ahmed و date و kaissar و lana و spider.

<?php
$Array = array(
    array("Python" , "Java" , "C#"),
    array("html", "html5", "css3"),
    array("Java network", "python network", "c#network"),
    array("html index", "html5 index", "css3 style index.1.2"),
    array(
             array("Ahmed", "Ali", "Data"),
             array("ksaissar", "lana", "spider"),
          ),
    array("python information security", "java information security", "c# information security"),
    );
    echo "<pre>";
    print_r($Array);
    echo "</pre>";
?>

شاهد كيف تم تنفيذ العملية و نحن نعرف الآن بأن المصفوفة رقم 4 بها مصفوفات فرعية ايضاً. هنا يكون بها مصفوفة فرعية رقم 0 و بها عناصر و ايضاً يوجد مصفوفة اخرى رقمها 1 و بها عناصر. و نحن الآن نريد أن نقوم بطبع spider الموجود داخل المصفوفة الفرعية. رقم 1 و المصفوفة الفرعية رقم 4 دخل مصفوفة رئيسية بإسم Array. و سيكون كود الطبع [echo $Array[4[[1][2.

كما يمكن إنشاء مصفوفة فرعية داخل مصفوفة فرعية في أي مكان داخل المصفوفة الرئيسية. لكن إلى الآن نحن نتعامل مع indexed Array وهي بنا ناخذ مثال عن كيفية انشاء مصفوفة من نوع Associative Array.

مثال
<?php
$Array = array(
    'Dey 1' =>array("Python" , "Java" , "C#"),
    'Dey 2' =>array("html", "html5", "css3"),
    'Dey 3' =>array("Java network", "python network", "c#network"),
    'Dey 4' =>array("html index", "html5 index", "css3 style index.1.2"),
    'Dey 5' =>array("python information security", "java information security", "c# information security"),
    );
    echo "<pre>";
    print_r($Array);
    echo "</pre>";
?>

في الكود لم يتغير شيئ سوى نوع المصفوفة و قمنا بتحويل المصفوفة من نوع Indexed Array إلى Associative Array. و سيكون شكل المصفوفة بعد الطباعة.

وكما يمكن أن تقوم بطبع أي عنصر من داخل أي مصفوفة على سبيل المثال نريد طبع عنصر html5 من داخل مصفوفة Dey 2. و سيكون شكل العملية أثناء طبع العنصر [echo $Array ['Dey 2'][0. لنقوم بإنشاء مصفوفات فرعية داخل كل مصفوفة و تلك المصفوفات ستكون أسماء الأشخاص الذي يقدمون كل دورة منهم.

<?php
$Array = array(
    'Dey 1' =>array("Python" , "Java" , "C#", array(
                       'python' => 'kissar',
                       'java' => 'data',
                       'python' => 'saja'
                       )),
    'Dey 2' =>array("html", "html5", "css3",array(
                      'html' => 'kissar',
                      'html5' => 'Ali',
                      'css3' => 'Spider'
                      )),
    'Dey 3' =>array("Java network", "python network", "c# network",array(
                     'Java network' => 'Yosef',
                     'python network' => 'ibrahim',
                     'c# network' => 'muhammad'
                     )),
    'Dey 4' =>array("html index", "html5 index", "css3 style index.1.2"(
                     'html index' => 'mhammad',
                     'html5 index' => 'salah',
                     'css3 style index.1.2' => 'kamal'
                     )),
    'Dey 5' =>array("python information security", "java information security", "c# information security",array(
                   'python information security' => 'parrot',
                   'java information security' => 'wzer',
                   'c# information security' => 'ahmd'
                    )),
    );
    echo "<pre>";
    print_r($Array);
    echo "</pre>";
?>

شاهدوا كيف كان الكود من قبل و الآن, تمت إضافة الأشخاص العاملين على الدورات و تم إضافة المصفوفات الفرعية بطريقة جيدة.

الآن يمكن طباعة أي عنصر من داخل أي مصفوفة فقط كل ما عليك هو معرفة إسم العنصر و اين يقع العنصر. على سبيل المثال نريد طبع إسم الشخص الذي يقدم دورة c#, network كيف سيكون عملية الطبع؟ ستكون عملية الطباعة بالشكل.

echo $Array['Dey 3'][3]['c# network']

الآن اصبح كل شيئ واضح و إن لم تفهموا الأمر اكتبوا استفساراتكم في تعليقات هذا الدرس.


Tags:
Muhammad Alush

Muhammad Alush

إسمي محمد تركي العلوش من سورية من ريف حلب الشرقي 1994, محب للتقنية و التعلم الذاتي, و جميع خبراتي تعلمتها ذاتياً, و اللغات البرمجية التي أتقنها هي html, css, javascript, php, c, python بالإضافة إلى حبي الكبير لمجال الشبكات.

موقعي programmer-tech.com