الخوارزميات وهياكل البيانات في PHP: من أين يبدأ المبتدئ
يعد إتقان الخوارزميات وهياكل البيانات مرحلة أساسية في تكوين أي مطور، بما في ذلك أولئك الذين اختاروا PHP. يعتقد العديد من المبتدئين خطأً أن معرفة بناء الجملة والأطر فقط كافية لتطوير الويب. ومع ذلك، فإن فهم كيفية تنظيم البيانات ومعالجتها بكفاءة يؤثر بشكل مباشر على أداء مشاريعك وقابليتها للتوسع. في هذه المقالة، سنشرح المفاهيم الأساسية من خلال أمثلة عملية في PHP ستساعدك على اتخاذ خطوتك الأولى نحو عالم البرمجة الفعالة.
لماذا تعتبر هياكل البيانات مهمة في PHP؟
PHP هي لغة ذات كتابة ديناميكية، والمصفوفة المدمجة (array) هي في الواقع هجين: يمكنها العمل كقائمة وكمفردة (جدول تجزئة). هذا قوي، ولكن بدون فهم الهياكل الأساسية، فإنك تخاطر بكتابة كود غير أمثل. على سبيل المثال، قد يستغرق البحث عن عنصر في مصفوفة غير مرتبة من 10,000 سجل وقتًا أطول بمقدار 100 مرة من البحث في جدول تجزئة.
الهياكل الأساسية التي سننظر فيها:
- المصفوفات — الأساس، ولكن مع بعض الفروق الدقيقة.
- المكدس والطابور — للمهام ذات ترتيب معالجة محدد.
- القوائم المرتبطة — لإدارة الذاكرة الديناميكية.
- جداول التجزئة — للوصول السريع عن طريق المفتاح.
1. المصفوفات والعمل معها: من البسيط إلى المعقد
في PHP، المصفوفة هي تعيين مرتب يربط المفاتيح بالقيم. ولكن حتى مع هذا الهيكل العالمي، يمكن العمل بطرق مختلفة.
المصفوفات المفهرسة والترابطية
تستخدم المصفوفة المفهرسة مفاتيح صحيحة، بينما تستخدم المصفوفة الترابطية مفاتيح نصية. مثال:
<?php// مصفوفة مفهرسة$fruits = ["apple", "banana", "cherry"];echo $fruits[1]; // banana
// مصفوفة ترابطية (جدول تجزئة)$user = [ "name" => "Alice", "age" => 30, "city" => "Moscow"];echo $user["name"]; // Alice?>العمليات على المصفوفات
الإضافة والحذف والبحث هي عمليات أساسية. من المهم معرفة تعقيدها الزمني:
array_push()/$arr[] = $val— O(1) في المتوسط.array_pop()— O(1).array_shift()— O(n)، لأنه يعيد فهرسة جميع العناصر.in_array()— O(n) للمصفوفات غير المرتبة.isset($arr[$key])— O(1) للمصفوفات الترابطية.
مثال على الاستخدام الفعال للمصفوفة الترابطية لحساب تكرار الكلمات:
<?php$text = "apple banana apple cherry banana apple";$words = explode(" ", $text);$freq = [];
foreach ($words as $word) { if (isset($freq[$word])) { $freq[$word]++; } else { $freq[$word] = 1; }}
print_r($freq);// Array ( [apple] => 3 [banana] => 2 [cherry] => 1 )?>2. المكدس والطابور: مبادئ LIFO و FIFO في PHP
المكدس (Last In, First Out) والطابور (First In, First Out) هما هيكلان كلاسيكيان يمكن تنفيذهما بسهولة في PHP باستخدام المصفوفات.
تنفيذ المكدس
يستخدم المكدس، على سبيل المثال، للتحقق من توازن الأقواس أو التراجع عن الإجراءات (undo).
<?phpclass Stack { private array $items = [];
public function push($item): void { $this->items[] = $item; // O(1) }
public function pop() { return array_pop($this->items); // O(1) }
public function peek() { return end($this->items); // O(1) }
public function isEmpty(): bool { return empty($this->items); }}
// مثال: التحقق من توازن الأقواسfunction isBalanced(string $expr): bool { $stack = new Stack(); $pairs = [')