فرز مصفوفة حسب قيمة عمود في PHP: دليل لمن سئم من البحث
\n\nهل سبق لك أن واجهت موقفًا حيث لديك قائمة من المستخدمين أو المنتجات أو الطلبات على شكل مصفوفة من المصفوفات الترابطية، وتحتاج إلى فرزها حسب حقل معين؟ مثلًا حسب العمر أو السعر أو تاريخ التسجيل. إذا كان الأمر كذلك - فأنت لست وحدك. هذا السؤال على Stack Overflow حصل على آلاف المشاهدات وعشرات الأصوات. واليوم سنحلّه نهائيًا.
\n\nفي هذه المقالة، لن نعرض فقط كيفية عمل usort و array_multisort. بل سنجيب على الأسئلة الأكثر شيوعًا التي تطرأ لدى المطورين: كيفية الفرز حسب مفتاح متداخل، كيفية الحفاظ على المفاتيح، كيفية الفرز حسب عدة حقول، وماذا تفعل إذا كانت البيانات تأتي من قاعدة بيانات.
هيا بنا!
\n\nما هي مصفوفة المصفوفات الترابطية ولماذا نفرزها؟
\n\nتخيل أن لديك قائمة من المستخدمين:
\n\n$users = [\n ['name' => 'آنا', 'age' => 25, 'city' => 'موسكو'],\n ['name' => 'بوريس', 'age' => 30, 'city' => 'سانت بطرسبرغ'],\n ['name' => 'فيكتور', 'age' => 22, 'city' => 'قازان'],\n];\n\nهذه مصفوفة متعددة الأبعاد نموذجية في PHP، حيث كل عنصر هو مصفوفة ترابطية بمفاتيح متطابقة. غالبًا ما تحتاج إلى عرض هذه القائمة مرتبة حسب حقل معين: حسب العمر (من الأصغر إلى الأكبر)، حسب الاسم (ترتيب أبجدي) أو حسب المدينة.
\n\nالدوال القياسية في PHP مثل sort() أو asort() لن تساعد هنا - فهي تعمل مع القيم البسيطة، وليس مع الهياكل المتداخلة. نحتاج إلى أدوات خاصة.
الطريقة الأكثر شيوعًا: usort مع دالة مجهولة
\n\nإذا دخلت إلى Stack Overflow وفتحت النقاش "Sort an array of associative arrays by column value"، ففي 90% من الحالات سينصحونك باستخدام usort. هذا منطقي: الدالة usort تسمح لك بتعيين منطق المقارنة الخاص بك بين عنصري المصفوفة.
كيفية فرز مصفوفة حسب حقل واحد (العمر)
\n\nلنفترض أننا نريد فرز المستخدمين حسب العمر تصاعديًا:
\n\n<?php\n$users = [\n ['name' => 'آنا', 'age' => 25, 'city' => 'موسكو'],\n ['name' => 'بوريس', 'age' => 30, 'city' => 'سانت بطرسبرغ'],\n ['name' => 'فيكتور', 'age' => 22, 'city' => 'قازان'],\n];\n\nusort($users, function($a, $b) {\n return $a['age'] <=> $b['age'];\n});\n\nprint_r($users);\n?>\n\nالنتيجة:
\nArray\n(\n [0] => Array ( [name] => فيكتور [age] => 22 [city] => قازان )\n [1] => Array ( [name] => آنا [age] => 25 [city] => موسكو )\n [2] => Array ( [name] => بوريس [age] => 30 [city] => سانت بطرسبرغ )\n)\n\nلاحظ: نحن نستخدم عامل الفضاء <=> (spaceship)، الذي ظهر في PHP 7. يُرجع -1 أو 0 أو 1، وهو مثالي لدوال الفرز. إذا كنت بحاجة إلى الفرز تنازليًا، فقط قم بتبديل $a و $b:
usort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n\nالفرز حسب حقل نصي (الاسم)
\n\nبالنسبة للنصوص، الأمر بنفس السهولة. هل تريد فرز المستخدمين حسب الاسم أبجديًا؟ تفضل:
\n\nusort($users, function($a, $b) {\n return strcmp($a['name'], $b['name']);\n});\n\nأو استخدم <=> مرة أخرى - فهو يعمل مع النصوص أيضًا:
usort($users, function($a, $b) {\n return $a['name'] <=> $b['name'];\n});\n\nالأسئلة الشائعة والمزالق
\n\n1. كيفية الفرز حسب مفتاح متداخل؟
\n\nأحيانًا تكون البيانات ذات هيكل أعمق. على سبيل المثال، كل مستخدم لديه مصفوفة profile