من الكائن إلى المصفوفة: لماذا تحتاج ذلك وكيف تتجنب المشاكل
\n\nكل مطور PHP يواجه عاجلاً أم آجلاً مهمة تحويل كائن (مثلاً من API، قاعدة بيانات، أو مكتبة) إلى مصفوفة ترابطية عادية. تبدو عملية بسيطة، لكن الشيطان يكمن في التفاصيل. التحويل الخاطئ قد يؤدي إلى فقدان البيانات، أنواع غير متوقعة، أو أخطاء فادحة.
\n\nفي هذا المقال، سنستعرض ثلاث طرق رئيسية لتحويل كائن PHP إلى مصفوفة ترابطية، ونقارن أداءها، وعمق المعالجة، والمزالق المحتملة. ستتعرف على الطريقة المثلى لـ 90% من المهام، وأيها الأفضل تركه للتجارب المخبرية. هيا بنا!
الطريقة الأولى: تحويل النوع السحري (array)
\n\nالطريقة الأكثر وضوحاً وإيجازاً هي استخدام تحويل النوع: (array) $object. هذه الطريقة مدمجة في PHP وتعمل فوراً. دعنا نرى مثالاً.
<?php\n$user = new stdClass();\n$user->name = 'أحمد';\n$user->age = 28;\n$user->email = 'ahmed@example.com';\n\n$array = (array) $user;\nprint_r($array);\n?>\n\nالنتيجة:
\n\nArray\n(\n [name] => أحمد\n [age] => 28\n [email] => ahmed@example.com\n)\n\nتبدو مثالية؟ تقريباً. لكن هناك بعض التفاصيل الدقيقة.
\n\nمزايا طريقة (array)
\n- \n
- البساطة والسرعة — عملية واحدة، لا حلقات تكرار. \n
- تعمل مع أي كائن، بما في ذلك نسخ الفئات المخصصة. \n
- تحتفظ بالخصائص العامة (public) للكائن. \n
العيوب والمزالق
\n- \n
- غير متكررة — إذا كانت خاصية الكائن هي نفسها كائن، فلن يتم تحويلها إلى مصفوفة. ستحصل على كائن متداخل داخل المصفوفة. \n
- مشكلة الخصائص الخاصة والمحمية — تظهر في المصفوفة بأسماء تحتوي على أحرف فارغة (\\0). هذا يعطل التسلسل. \n
- تغيير المفاتيح — بالنسبة للفئات المدمجة (DateTime، PDOStatement)، قد يكون السلوك غير متوقع. \n
مثال على مشكلة الخاصية الخاصة:
\n\n<?php\nclass User {\n public $name = 'خالد';\n private $password = 'secret123';\n}\n\n$user = new User();\n$array = (array) $user;\nvar_dump(array_keys($array));\n// سيطبع: array(2) { [0]=> string(4) "name" [1]=> string(17) "\\0User\\0password" }\n?>\n\nكما ترى، المفتاح \\0User\\0password ليس ما ترغب في رؤيته في كودك.
الطريقة الثانية: جسر JSON (json_decode + json_encode)
\n\nالطريقة الثانية الشائعة هي تسلسل الكائن أولاً إلى JSON، ثم فك ترميزه إلى مصفوفة. هذا يحل مشكلة التكرار والخصائص الخاصة، لكنه يضيف تكاليف إضافية.
\n\n<?php\n$object = new stdClass();\n$object->name = 'مريم';\n$object->skills = ['PHP', 'JavaScript', 'Python'];\n\n$array = json_decode(json_encode($object), true);\nprint_r($array);\n?>\n\nالنتيجة:
\n\nArray\n(\n [name] => مريم\n [skills] => Array\n (\n [0] => PHP\n [1] => JavaScript\n [2] => Python\n )\n)\n\nالآن المصفوفة المتداخلة skills أصبحت مصفوفة أيضاً، وليس كائناً. ممتاز!
متى تنقذك هذه الطريقة
\n- \n
- الهياكل المتداخلة بعمق — يتم التعامل مع التكرار تلقائياً. \n
- نظافة البيانات — لا رموز خدمية في المفاتيح. \n
- التوافق — إذا كنت تعمل بالفعل مع JSON (API، قواعد البيانات)، فهذا اختيار طبيعي. \n
عيوب نهج JSON
\n- \n
- فقدان الأنواع — الأعداد الصحيحة تبقى صحيحة، لكن كائنات مثل DateTime تتحول إلى نصوص. الكائنات التي تحتوي على دوال تفقد سلوكها. \n