المصفوفات — الأساسيات

المصفوفة في لغة PHP ليست مصفوفة عادية — إنها بنية بيانات متطورة تعمل كقائمة وقاموس ومجموعة في آن واحد. في لغة PHP، تُعد المصفوفات نوع البيانات الوحيد الذي ستستخدمه أكثر من أي شيء آخر، دون استثناء.

1. ما هي مصفوفة PHP حقًّا؟

مصفوفة PHP هي في الأساس خريطة مرتبة. وبعبارة بسيطة: فهي تربط المفاتيح بـالقيم وتحتفظ بترتيب الإدراج.

PHP
<?php
// Indexed array: keys are automatically assigned numbers (0, 1, 2, ...)
$fruits = ["apple", "banana", "orange"];

// Associative array: keys are strings you specify
$user = [
    "name" => "John",
    "age" => 25,
    "city" => "New York"
];
?>
اللغة القائمة القاموس مصفوفة PHP
بايثون list dict array يقوم بكليهما
جافا سكريبت Array Object / Map array يقوم بكليهما
PHP array array هيكل واحد يتولى كل شيء

2. إنشاء المصفوفات

توفر لغة PHP طريقتين لكتابة المصفوفات. [] هي الصيغة الحديثة (PHP 5.4+) — استخدم هذه الصيغة:

PHP
<?php
// Recommended syntax (PHP 5.4+)
$arr1 = [];                       // Empty array
$arr2 = [1, 2, 3];                // Indexed array
$arr3 = ["a" => 1, "b" => 2];     // Associative array

// Legacy syntax (for compatibility with older code)
$arr4 = array();
$arr5 = array(1, 2, 3);
$arr6 = array("a" => 1, "b" => 2);
?>
💡 نصيحة: [] أقصر بخمس أحرف من array(). لا يوجد سبب يمنعك من استخدامه.


3. الوصول إلى عناصر المصفوفة

استخدم الأقواس المربعة [] مع مفتاح لقراءة العناصر أو تعديلها:

PHP
<?php
$fruits = ["apple", "banana", "orange"];

echo $fruits[0];     // apple (index starts at 0)
echo $fruits[1];     // banana
echo $fruits[2];     // orange

$fruits[1] = "strawberry"; // Modify the second element
echo $fruits[1];     // strawberry

// Access associative arrays by key name
$user = ["name" => "John", "age" => 25];
echo $user["name"];  // John
$user["age"] = 26;   // Update the age
?>
⚠️ تحذير: يؤدي الوصول إلى مفتاح غير موجود إلى ظهور Warning: Undefined array key. اعتد على التحقق أولاً باستخدام isset() أو array_key_exists().


4. إضافة العناصر وحذفها

PHP
<?php
// === Adding Elements ===

$arr = [1, 2];
$arr[] = 3;          // Append to the end (the simplest syntax)
// $arr is now [1, 2, 3]

// Or use array_push (convenient when adding multiple)
array_push($arr, 4, 5);
// $arr is now [1, 2, 3, 4, 5]

// Add with a specific key
$arr["key"] = "value";

// === Removing Elements ===

unset($arr[2]);      // Remove the element with index 2
// $arr is now [1, 2, 4, 5, "key"=>"value"]

// array_pop: remove and return the last element
$last = array_pop($arr);

// array_shift: remove and return the first element
$first = array_shift($arr);
?>
💡 نصيحة: $arr[] = $val هي صيغة الإضافة الأكثر شيوعًا في لغة PHP — فهي أكثر إيجازًا من array_push() وأسرع قليلاً (لا تتطلب عبء استدعاء الدالة).


5. تصفح المصفوفات

PHP
<?php
$fruits = ["apple", "banana", "orange"];

// foreach for indexed arrays (value only)
foreach ($fruits as $fruit) {
    echo $fruit . "<br>";
}

// foreach for associative arrays (key and value)
$user = ["name" => "John", "age" => 25, "city" => "New York"];
foreach ($user as $key => $value) {
    echo "{$key}: {$value}<br>";
}
// name: John
// age: 25
// city: New York
?>

لا يهم foreach ما إذا كان المصفوفة مفهرسة أم ترابطية — فهو يتنقل بين جميع عناصرها بسلاسة. وهذا هو جمال نوع المصفوفة الموحد في PHP.

▶ مثال: تصفح المصفوفات المتداخلة

PHP
<?php
// Real-world: iterating through a student grade sheet
// (mixing associative and indexed arrays)
$classroom = [
    ["name" => "Alice", "scores" => ["Math" => 85, "English" => 92]],
    ["name" => "Bob", "scores" => ["Math" => 78, "English" => 88]],
];
foreach ($classroom as $student) {
    $total = array_sum($student["scores"]);
    echo "{$student['name']} — Total: {$total}<br>";
}
?>
▶ جرّب الكود

6. تصحيح أخطاء المصفوفات

PHP
<?php
$user = [
    "name" => "John",
    "age" => 25,
    "skills" => ["PHP", "MySQL", "JavaScript"]
];

// var_dump: the most detailed debug output (includes type and length)
var_dump($user);
/*
array(3) {
  ["name"]=> string(4) "John"
  ["age"]=> int(25)
  ["skills"]=> array(3) { [0]=> ... }
}
*/

// print_r: a concise version (shows structure only, no types)
print_r($user);
/*
Array ( [name] => John [age] => 25 [skills] => Array (...) )
*/

// In HTML, use <pre> tags for cleaner output
echo "<pre>";
print_r($user);
echo "</pre>";
?>
💡 نصيحة: هل تحتاج إلى رؤية بنية المصفوفة بالكامل أثناء التطوير؟ → var_dump(). هل تحتاج فقط إلى إلقاء نظرة سريعة على المحتوى؟ → echo "<pre>" + print_r(). في بيئة الإنتاج؟ → لا تقم أبدًا بإخراج المصفوفات مباشرةً؛ استخدم التسجيل.


7. count() — حساب عدد العناصر

PHP
<?php
$fruits = ["apple", "banana", "orange"];
echo count($fruits);     // 3

$empty = [];
echo count($empty);      // 0

// sizeof is an alias for count — they're identical
echo sizeof($fruits);    // 3
?>

8. التحقق من وجود مفتاح أو قيمة

PHP
<?php
$user = ["name" => "John", "age" => 25];

// Check if a key exists
var_dump(array_key_exists("name", $user));   // bool(true)
var_dump(array_key_exists("email", $user));  // bool(false)

// Check if a value exists
var_dump(in_array("John", $user));   // bool(true)
var_dump(in_array("Jane", $user));   // bool(false)
?>

▶ مثال: أنماط الوصول الآمن إلى المصفوفات

PHP
<?php
// When you're not sure a key exists, check first
$user = ["name" => "John"];

// Safe pattern
if (isset($user["age"])) {
    echo $user["age"];
} else {
    echo "Age not set";
}

// Concise pattern: use ?? to provide a default
$age = $user["age"] ?? "Unknown";
echo $age;  // Unknown (because the "age" key doesn't exist)
?>
▶ جرّب الكود
💡 نصيحة: isset() مقابل ??: تتحقق isset($arr['key']) من وجود المفتاح ومن أن القيمة ليست فارغة. أما array_key_exists('key', $arr) فتتحقق فقط من وجود المفتاح (وتُرجع القيمة «true» حتى لو كانت القيمة فارغة).

❓ أسئلة شائعة

س ما الفرق بين مصفوفة PHP ومصفوفة JavaScript؟
ج مصفوفة PHP هي بنية شاملة (تجمع بين القائمة والقاموس في بنية واحدة). أما مصفوفة JavaScript فهي مجرد قائمة؛ بينما يتولى الكائن (Object) أو الخريطة (Map) دور القاموس. في PHP، [0=>"a", 1=>"b"] و["x"=>1, "y"=>2] هما من نفس النوع تمامًا.
س ما الفرق بين المصفوفات المفهرسة والمصفوفات الترابطية؟
ج من وجهة نظر لغة PHP، لا يوجد فرق جوهري — فكلاهما عبارة عن خرائط مرتبة. تحتوي المصفوفات المفهرسة على مفاتيح صحيحة يتم تعيينها تلقائيًا بدءًا من 0. أما المصفوفات الترابطية فتحتوي على مفاتيح سلاسل نصية مخصصة. يمكنك حتى المزج بينهما: ["a"=>1, 2=>3, 4=>5] صيغة صحيحة تمامًا.
س لماذا لا يؤدي استخدام «foreach» إلى تعديل المصفوفة الأصلية؟
ج ما لم تستخدم &$val للتنقل المرجعي، فإن foreach ($arr as $val) تعطي $val كنسخة من كل عنصر في المصفوفة. ولا يؤثر تعديل $val على المصفوفة الأصلية.

📖 ملخص

📝 تمارين

  1. أنشئ مصفوفة مفهرسة تحتوي على 5 أسماء مدن، ثم اعرض قائمة مرقمة باستخدام foreach، بعد ذلك استخدم $arr[] لإضافة مدينة أخرى، ثم أعد عرض القائمة.
  2. أنشئ مصفوفة مستخدم ترابطية تحتوي على 3 خصائص على الأقل (الاسم، العمر، البريد الإلكتروني، قائمة المهارات)، ثم استخدم عبارة foreach لعرضها في شكل جدول HTML. تعامل مع قائمة المهارات (التي هي مصفوفة بحد ذاتها) بطريقة خاصة — اعرضها كسلسلة مفصولة بفواصل.
  3. اكتب دالة safeGet($arr, $key, $default) تسترد قيمةً من مصفوفةً باستخدام المفتاح بأمان، وتُرجع القيمة الافتراضية في حالة عدم وجود المفتاح.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%