فرز مصفوفة حسب قيمة عمود في PHP: كل ما تحتاج معرفته

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

فرز مصفوفة حسب قيمة عمود في PHP: دليل لمن سئم من البحث

\n\n

هل سبق لك أن واجهت موقفًا حيث لديك قائمة من المستخدمين أو المنتجات أو الطلبات على شكل مصفوفة من المصفوفات الترابطية، وتحتاج إلى فرزها حسب حقل معين؟ مثلًا حسب العمر أو السعر أو تاريخ التسجيل. إذا كان الأمر كذلك - فأنت لست وحدك. هذا السؤال على Stack Overflow حصل على آلاف المشاهدات وعشرات الأصوات. واليوم سنحلّه نهائيًا.

\n\n

في هذه المقالة، لن نعرض فقط كيفية عمل usort و array_multisort. بل سنجيب على الأسئلة الأكثر شيوعًا التي تطرأ لدى المطورين: كيفية الفرز حسب مفتاح متداخل، كيفية الحفاظ على المفاتيح، كيفية الفرز حسب عدة حقول، وماذا تفعل إذا كانت البيانات تأتي من قاعدة بيانات.

\n\n

هيا بنا!

\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() لن تساعد هنا - فهي تعمل مع القيم البسيطة، وليس مع الهياكل المتداخلة. نحتاج إلى أدوات خاصة.

\n\n

الطريقة الأكثر شيوعًا: usort مع دالة مجهولة

\n\n

إذا دخلت إلى Stack Overflow وفتحت النقاش "Sort an array of associative arrays by column value"، ففي 90% من الحالات سينصحونك باستخدام usort. هذا منطقي: الدالة usort تسمح لك بتعيين منطق المقارنة الخاص بك بين عنصري المصفوفة.

\n\n

كيفية فرز مصفوفة حسب حقل واحد (العمر)

\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

النتيجة:

\n
Array\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:

\n\n
usort($users, function($a, $b) {\n    return $b['age'] <=> $a['age'];\n});
\n\n

الفرز حسب حقل نصي (الاسم)

\n\n

بالنسبة للنصوص، الأمر بنفس السهولة. هل تريد فرز المستخدمين حسب الاسم أبجديًا؟ تفضل:

\n\n
usort($users, function($a, $b) {\n    return strcmp($a['name'], $b['name']);\n});
\n\n

أو استخدم <=> مرة أخرى - فهو يعمل مع النصوص أيضًا:

\n\n
usort($users, function($a, $b) {\n    return $a['name'] <=> $b['name'];\n});
\n\n

الأسئلة الشائعة والمزالق

\n\n

1. كيفية الفرز حسب مفتاح متداخل؟

\n\n

أحيانًا تكون البيانات ذات هيكل أعمق. على سبيل المثال، كل مستخدم لديه مصفوفة profile

المدونات

توصيات الكتب