أساسيات PHP

دوال المصفوفات

13 دقيقة الدرس 13 من 45

إتقان دوال المصفوفات في PHP

يوفر PHP أكثر من 70 دالة مدمجة للمصفوفات تجعل العمل معها قوياً وفعالاً. في هذا الدرس، سنستكشف الدوال الأكثر فائدة وشيوعاً التي يجب على كل مطور PHP معرفتها.

ملاحظة: معظم دوال المصفوفات إما تعدل المصفوفة الأصلية في مكانها أو ترجع مصفوفة جديدة. تحقق دائماً من توثيق الدالة لفهم سلوكها.

دوال تحويل المصفوفات

array_map() - تحويل العناصر

تطبيق دالة رد نداء على كل عنصر:

<?php // تربيع جميع الأرقام $numbers = [1, 2, 3, 4, 5]; $squared = array_map(function($n) { return $n * $n; }, $numbers); print_r($squared); // [1, 4, 9, 16, 25] // التحويل إلى أحرف كبيرة $names = ["alice", "bob", "charlie"]; $upper = array_map("strtoupper", $names); print_r($upper); // ["ALICE", "BOB", "CHARLIE"] // مصفوفات متعددة $first = [1, 2, 3]; $second = [10, 20, 30]; $result = array_map(function($a, $b) { return $a + $b; }, $first, $second); print_r($result); // [11, 22, 33] ?>

array_filter() - تصفية العناصر

تصفية عناصر المصفوفة باستخدام دالة رد نداء:

<?php // تصفية الأرقام الزوجية $numbers = [1, 2, 3, 4, 5, 6, 7, 8]; $even = array_filter($numbers, function($n) { return $n % 2 === 0; }); print_r($even); // [2, 4, 6, 8] // تصفية القيم غير الفارغة $data = ["apple", "", "banana", null, "cherry", 0]; $filtered = array_filter($data); print_r($filtered); // ["apple", "banana", "cherry"] // التصفية مع المفاتيح $ages = ["John" => 25, "Jane" => 30, "Bob" => 17, "Alice" => 22]; $adults = array_filter($ages, function($age, $name) { return $age >= 18; }, ARRAY_FILTER_USE_BOTH); print_r($adults); ?>

array_reduce() - الاختزال إلى قيمة واحدة

اختزال المصفوفة إلى قيمة واحدة باستخدام دالة رد نداء:

<?php // جمع جميع الأرقام $numbers = [1, 2, 3, 4, 5]; $sum = array_reduce($numbers, function($carry, $item) { return $carry + $item; }, 0); echo $sum; // 15 // إيجاد القيمة العظمى $max = array_reduce($numbers, function($carry, $item) { return $item > $carry ? $item : $carry; }, $numbers[0]); echo $max; // 5 // دمج النصوص $words = ["Hello", "World", "PHP"]; $sentence = array_reduce($words, function($carry, $item) { return $carry . " " . $item; }, ""); echo trim($sentence); // "Hello World PHP" ?>
نصيحة: array_map() و array_filter() و array_reduce() هي أنماط برمجة وظيفية أساسية. أتقنها للحصول على كود أنظف وأكثر تعبيراً.

دوال البحث في المصفوفات

in_array() - التحقق من وجود قيمة

<?php $fruits = ["apple", "banana", "cherry"]; if (in_array("banana", $fruits)) { echo "وجدت الموز!"; } // فحص النوع الصارم $numbers = [1, 2, 3, "4"]; var_dump(in_array(4, $numbers)); // true (مرن) var_dump(in_array(4, $numbers, true)); // false (صارم) ?>

array_search() - إيجاد مفتاح القيمة

<?php $colors = ["red", "green", "blue", "yellow"]; $key = array_search("blue", $colors); echo $key; // 2 // ترجع false إذا لم توجد $key = array_search("purple", $colors); if ($key === false) { echo "اللون غير موجود"; } // مع المصفوفات الترابطية $ages = ["John" => 25, "Jane" => 30, "Bob" => 25]; $name = array_search(25, $ages); echo $name; // "John" (أول تطابق) ?>

array_key_exists() مقابل isset()

<?php $data = ["name" => "John", "age" => null]; // array_key_exists تتحقق من وجود المفتاح (حتى لو كانت القيمة null) var_dump(array_key_exists("age", $data)); // true var_dump(array_key_exists("email", $data)); // false // isset ترجع false إذا كانت القيمة null var_dump(isset($data["age"])); // false var_dump(isset($data["name"])); // true ?>
تحذير: استخدم array_search() مع المقارنة الصارمة (===) لأنها ترجع المفتاح (الذي قد يكون 0)، وليس صحيح/خطأ.

دوال معالجة المصفوفات

array_slice() - استخراج جزء

<?php $fruits = ["apple", "banana", "cherry", "date", "elderberry"]; // الحصول على شريحة من الموضع 1، بطول 3 $slice = array_slice($fruits, 1, 3); print_r($slice); // ["banana", "cherry", "date"] // إزاحة سالبة (من النهاية) $slice = array_slice($fruits, -2); print_r($slice); // ["date", "elderberry"] // الحفاظ على المفاتيح $slice = array_slice($fruits, 1, 3, true); print_r($slice); ?>

array_splice() - إزالة واستبدال

<?php $colors = ["red", "green", "blue", "yellow"]; // إزالة عنصرين بدءاً من الفهرس 1 $removed = array_splice($colors, 1, 2); print_r($removed); // ["green", "blue"] print_r($colors); // ["red", "yellow"] // إزالة واستبدال $colors = ["red", "green", "blue", "yellow"]; array_splice($colors, 1, 2, ["orange", "purple"]); print_r($colors); // ["red", "orange", "purple", "yellow"] // إدراج بدون إزالة $colors = ["red", "blue"]; array_splice($colors, 1, 0, ["green"]); print_r($colors); // ["red", "green", "blue"] ?>

array_merge() - دمج المصفوفات

<?php // دمج المصفوفات المفهرسة $arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $merged = array_merge($arr1, $arr2); print_r($merged); // [1, 2, 3, 4, 5, 6] // دمج المصفوفات الترابطية (القيم اللاحقة تستبدل) $default = ["color" => "red", "size" => "M"]; $custom = ["size" => "L", "style" => "casual"]; $config = array_merge($default, $custom); print_r($config); // ["color" => "red", "size" => "L", "style" => "casual"] // دمج مصفوفات متعددة $result = array_merge($arr1, $arr2, [7, 8, 9]); print_r($result); ?>

دوال حساب المصفوفات

<?php $numbers = [10, 20, 30, 40, 50]; // مجموع جميع العناصر echo array_sum($numbers); // 150 // حاصل ضرب جميع العناصر echo array_product($numbers); // 12000000 // عد العناصر echo count($numbers); // 5 // عد تكرارات العناصر $items = ["apple", "banana", "apple", "cherry", "banana", "apple"]; $counts = array_count_values($items); print_r($counts); // ["apple" => 3, "banana" => 2, "cherry" => 1] ?>

دوال ترتيب المصفوفات

<?php // ترتيب المصفوفة المفهرسة (القيم) $numbers = [3, 1, 4, 1, 5, 9, 2, 6]; sort($numbers); // تصاعدي print_r($numbers); rsort($numbers); // تنازلي print_r($numbers); // ترتيب المصفوفة الترابطية (حسب القيمة، الحفاظ على المفاتيح) $ages = ["John" => 25, "Jane" => 30, "Bob" => 20]; asort($ages); // تصاعدي حسب القيمة print_r($ages); arsort($ages); // تنازلي حسب القيمة print_r($ages); // ترتيب المصفوفة الترابطية (حسب المفتاح) ksort($ages); // تصاعدي حسب المفتاح print_r($ages); krsort($ages); // تنازلي حسب المفتاح print_r($ages); // ترتيب مخصص باستخدام دالة رد نداء $words = ["apple", "Banana", "cherry", "Date"]; usort($words, function($a, $b) { return strcasecmp($a, $b); // غير حساس لحالة الأحرف }); print_r($words); ?>
ملاحظة: دوال الترتيب تعدل المصفوفة الأصلية وترجع صحيح/خطأ (وليس نسخة مرتبة).

دوال دمج المصفوفات

<?php // دمج مصفوفتين كمفاتيح وقيم $keys = ["name", "age", "city"]; $values = ["John", 25, "New York"]; $person = array_combine($keys, $values); print_r($person); // ["name" => "John", "age" => 25, "city" => "New York"] // تقسيم المصفوفة إلى مصفوفات أصغر $numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; $chunks = array_chunk($numbers, 3); print_r($chunks); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]] // ملء المصفوفة بقيم $filled = array_fill(0, 5, "x"); print_r($filled); // ["x", "x", "x", "x", "x"] // الملء بنطاق من القيم $range = range(1, 10, 2); print_r($range); // [1, 3, 5, 7, 9] ?>

دوال التفرد والاختلاف في المصفوفات

<?php // إزالة التكرارات $numbers = [1, 2, 2, 3, 4, 4, 5]; $unique = array_unique($numbers); print_r($unique); // [1, 2, 3, 4, 5] // إيجاد القيم في المصفوفة الأولى وليست في الثانية $arr1 = [1, 2, 3, 4, 5]; $arr2 = [3, 4, 5, 6, 7]; $diff = array_diff($arr1, $arr2); print_r($diff); // [1, 2] // إيجاد القيم المشتركة $intersect = array_intersect($arr1, $arr2); print_r($intersect); // [3, 4, 5] // الاختلاف حسب المفاتيح $a = ["a" => 1, "b" => 2, "c" => 3]; $b = ["b" => 2, "c" => 4, "d" => 5]; $diff = array_diff_key($a, $b); print_r($diff); // ["a" => 1] ?>

عكس المصفوفات والخلط

<?php // عكس ترتيب المصفوفة $colors = ["red", "green", "blue"]; $reversed = array_reverse($colors); print_r($reversed); // ["blue", "green", "red"] // قلب المفاتيح والقيم $map = ["a" => 1, "b" => 2, "c" => 3]; $flipped = array_flip($map); print_r($flipped); // [1 => "a", 2 => "b", 3 => "c"] // خلط المصفوفة (ترتيب عشوائي) $deck = ["A", "K", "Q", "J", "10"]; shuffle($deck); print_r($deck); // ترتيب عشوائي // الحصول على عنصر (عناصر) عشوائي $fruits = ["apple", "banana", "cherry", "date"]; $random = array_rand($fruits, 2); print_r($random); // مفتاحان عشوائيان ?>

مثال عملي: خط معالجة البيانات

<?php // معالجة بيانات المستخدمين $users = [ ["name" => "John Doe", "age" => 25, "active" => true], ["name" => "Jane Smith", "age" => 17, "active" => true], ["name" => "Bob Johnson", "age" => 35, "active" => false], ["name" => "Alice Brown", "age" => 28, "active" => true] ]; // التصفية: الحصول على المستخدمين البالغين النشطين $activeAdults = array_filter($users, function($user) { return $user["active"] && $user["age"] >= 18; }); // التحويل: استخراج الأسماء $names = array_map(function($user) { return $user["name"]; }, $activeAdults); // الاختزال: إنشاء قائمة مفصولة بفواصل $nameList = array_reduce($names, function($carry, $name) { return $carry ? $carry . ", " . $name : $name; }, ""); echo "المستخدمون البالغون النشطون: $nameList"; // الناتج: المستخدمون البالغون النشطون: John Doe, Alice Brown ?>

مثال عملي: عمليات سلة التسوق

<?php $cart = [ ["id" => 1, "name" => "Laptop", "price" => 999, "qty" => 1], ["id" => 2, "name" => "Mouse", "price" => 25, "qty" => 2], ["id" => 3, "name" => "Keyboard", "price" => 75, "qty" => 1] ]; // حساب الإجماليات الفرعية $cartWithSubtotals = array_map(function($item) { $item["subtotal"] = $item["price"] * $item["qty"]; return $item; }, $cart); // حساب الإجمالي $total = array_reduce($cartWithSubtotals, function($sum, $item) { return $sum + $item["subtotal"]; }, 0); echo "إجمالي السلة: $$total"; // إجمالي السلة: $1124 // إيجاد عنصر محدد $itemKey = array_search(2, array_column($cart, "id")); if ($itemKey !== false) { echo "وُجد: " . $cart[$itemKey]["name"]; } // الترتيب حسب السعر usort($cart, function($a, $b) { return $a["price"] - $b["price"]; }); ?>
تمرين:
  1. أنشئ مصفوفة من الأرقام واستخدم دوال المصفوفات لـ:
    • تصفية الأرقام الزوجية فقط
    • تربيع كل رقم
    • حساب مجموع جميع الأرقام الزوجية المربعة
  2. أنشئ مصفوفة من الطلاب بالاسم والدرجة والمادة. اكتب كوداً لـ:
    • تصفية الطلاب بدرجات أعلى من 80
    • ترتيبهم حسب الدرجة تنازلياً
    • استخراج أسمائهم فقط
  3. أنشئ مصفوفتين وابحث عن اتحادهما وتقاطعهما واختلافهما
  4. اكتب دالة تزيل القيم المكررة من مصفوفة متداخلة

نصائح الأداء

  • استخدم isset() بدلاً من array_key_exists() عندما لا تكون القيم الفارغة مهمة (إنها أسرع)
  • استخدم array_map() بدلاً من حلقات foreach عند تحويل جميع العناصر
  • تجنب array_merge() في الحلقات؛ استخدم array_push() أو [] بدلاً من ذلك
  • استخدم array_column() لاستخراج عمود واحد من المصفوفات متعددة الأبعاد
  • اربط دوال المصفوفات للحصول على كود أنظف وأكثر قابلية للقراءة
نصيحة: تعلم التفكير وظيفياً باستخدام array_map() و array_filter() و array_reduce(). غالباً ما تؤدي إلى كود أنظف وأكثر قابلية للصيانة من الحلقات التقليدية.

الأنماط الشائعة

<?php // استخراج عمود من مصفوفة ثنائية الأبعاد $users = [ ["name" => "John", "email" => "john@example.com"], ["name" => "Jane", "email" => "jane@example.com"] ]; $emails = array_column($users, "email"); // استخراج مع المفاتيح $emailMap = array_column($users, "email", "name"); print_r($emailMap); // ["John" => "john@example.com", "Jane" => "jane@example.com"] // التجميع حسب المفتاح $items = [ ["category" => "fruit", "name" => "apple"], ["category" => "fruit", "name" => "banana"], ["category" => "veggie", "name" => "carrot"] ]; $grouped = []; foreach ($items as $item) { $grouped[$item["category"]][] = $item["name"]; } print_r($grouped); ?>

الملخص

في هذا الدرس، تعلمت:

  • دوال التحويل: array_map() و array_filter() و array_reduce()
  • دوال البحث: in_array() و array_search() و array_key_exists()
  • دوال المعالجة: array_slice() و array_splice() و array_merge()
  • دوال الحساب: array_sum() و array_product() و count()
  • عمليات المجموعات: array_unique() و array_diff() و array_intersect()
  • التطبيقات العملية في معالجة البيانات والمنطق التجاري

إتقان دوال المصفوفات ضروري لكتابة كود PHP فعال ونظيف. تدرب على دمجها لحل المشكلات المعقدة بأناقة!

ES
Edrees Salih
منذ 22 ساعة

We are still cooking the magic in the way!