Advertisement
  1. Code
  2. PHP

كيفية فرز المصفوفات في PHP

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

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

الفرز يجعل الكثير من المهام التي تتطلب الوصول إلى أو الحصول على مجموعة محددة من البيانات سهلة للغاية وفعالة. في هذا البرنامج التعليمي ، سوف نتعلم كيفية استخدام وظائف PHP المضمنة لفرز أنواع مختلفة من الصفيف.

فرز مصفوفة حسب القيمة

إن تصنيف مصفوفة بقيمة عناصرها سهل للغاية في PHP. يمكنك اختيار الحفاظ على ارتباطات القيمة الرئيسية أو تجاهلها ، ويمكنك أيضًا تحديد وظائفك الخاصة لإملاء كيفية فرز العناصر. سوف أظهر لك كيف في هذا القسم من البرنامج التعليمي.

يمكنك استخدام دالة (sort(&$array, $sort_flags لفرز قيم مصفوفة من أقل إلى أعلى. ومع ذلك ، فإنه لن يحافظ على أي صلة رئيسية بين القيم عند فرز المصفوفة. يتم تعيين مفاتيح جديدة للعناصر المفردة بدلاً من إعادة ترتيب بسيطة. تسمح لك العامل الثاني الاختياري بتحديد كيفية فرز العناصر. يمكن أن يكون لها ستة قيم مختلفة:

  1. SORT_REGULAR — سيؤدي هذا إلى فرز القيم دون تغيير أنواعها.
  2. SORT_NUMERIC - سيؤدي هذا إلى فرز القيم عن طريق المقارنة بينها رقميًا.
  3. SORT_STRING - سيؤدي هذا إلى فرز القيم بمقارنتها كسلسلة.
  4. SORT_LOCALE_STRING— سيقارن هذا القيم كسلسلة استنادًا إلى اللغة الحالية. يمكنك تحديث الإعدادات المحلية بنفسك باستخدام setlocale ().
  5. SORT_NATURAL - سيؤدي هذا إلى فرز العناصر باستخدام "ترتيب طبيعي" أثناء مقارنتها كسلسلة.
  6. SORT_FLAG_CASE - يمكن دمج هذا مع SORT_STRING أو SORT_NATURAL لإيقاف تشغيل التأثر بحالة أثناء فرز السلاسل.

إليك مثالان للتصنيف لمساعدتك على فهم الفرق بين كل علامات التصنيف بسرعة.

1
<?php
2
3
$random_data = [32508, 98134, "234984", "3249832", "38", 123, "Apple"];
4
5
sort($random_data);
6
echo "Regular Sorting  — ";
7
foreach($random_data as $element) {
8
    echo str_pad($element, 9)." ";
9
}
10
// Regular Sorting  — 38        123       32508     98134     234984    3249832   Apple

11
12
sort($random_data, SORT_NUMERIC);
13
echo "\nNumeric Sorting  — ";
14
foreach($random_data as $element) {
15
    echo str_pad($element, 9)." ";
16
}
17
// Numeric Sorting  — Apple     38        123       32508     98134     234984    3249832

18
19
sort($random_data, SORT_STRING);
20
echo "\nString Sorting   — ";
21
foreach($random_data as $element) {
22
    echo str_pad($element, 9)." ";
23
}
24
// String Sorting   — 123       234984    3249832   32508     38        98134     Apple

في المثال ، الفرز المنتظم ، يتم تحويل السلاسل العددية إلى قيمها العددية ويتم الفرز وفقًا لذلك. السلسلة "Apple" غير رقمية حتى يتم تركها بدون مساس ومقارنة كسلسلة.

في المثال الثاني ، الفرز الرقمي ، نريد أن يتم فرز البيانات استنادًا إلى القيمة العددية ، بحيث يتم تحويل "Apple" إلى القيمة الرقمية 0 ، ويأتي أولاً. يتم فرز بقية القيم كما هو متوقع.

في المثال الثالث ، يتم التعامل مع جميع القيم كسلسلة. وهذا يعني أنه بدلاً من مقارنة القيمة العددية لـ 123 أو 3249832 مع 38 ، تتم مقارنتها كسلسلة - حرف واحد في كل مرة. نظرًا لأن "1" يأتي قبل "3" ، تعتبر القيمة 123 أقل من 38.

إذا كنت تريد فرز قيم الصفيف من الأعلى إلى المنخفض بدلاً من منخفض إلى مرتفع ، فيمكنك القيام بذلك بمساعدة دالة () rsort. تقبل جميع العوامل المتشابهة الدالة ()sort ولكن تفرز القيم في ترتيب عكسي. كما أنه لا يحافظ على أي ارتباطات بالقيمة الرئيسية ، لذا فهو ليس اختيارًا جيدًا لفرز مصفوفات ذات صلة.

فرز مصفوفة ذات صلة رابطة

تصبح ارتباطات القيمة الأساسية مهمة عندما تتعامل مع مصفوفات لها ارتباط. فكر في المثال التالي حيث يتم استخدام مصفوفة ارتباطية لتخزين أسماء الأشخاص المختلفين والفاكهة المفضلة لديهم. إذا كنت تريد فرز القائمة أبجديًا حسب اسم الثمار ، فإن استخدام الوظيفة sort () من القسم السابق سيؤدي إلى فقدان المفاتيح الرابطة.

1
<?php
2
3
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];
4
5
echo "Before Sorting — \n";
6
foreach($fruit_preferences as $person=>$preference) {
7
    echo $person." likes ".$preference."\n";
8
}
9
10
/*

11
Before Sorting — 

12
James likes Orange

13
John likes Banana

14
Patricia likes Apple

15
Jennifer likes Mango

16
Mary likes Grapes

17
*/
18
19
sort($fruit_preferences);
20
21
echo "After Sorting  — \n";
22
foreach($fruit_preferences as $person=>$preference) {
23
    echo $person." likes ".$preference."\n";
24
}
25
26
/*

27
After Sorting  — 

28
0 likes Apple

29
1 likes Banana

30
2 likes Grapes

31
3 likes Mango

32
4 likes Orange

33
*/
34
35
?>

كما ترون ، نحن لم نخسر فقط ارتباط الأشخاص بثمارهم المفضلة ، بل فقدنا أيضًا أسماء الأشخاص المختلفين. تم تعيين كل قيمة تم فرزها على أساس رقمي جديد استنادًا إلى موضعها في المصفوفة التي تم فرزها.

لمساعدتك في معالجة هذه المشكلة بسهولة ، تحتوي PHP على وظيفتين مختلفتين تحافظان على ارتباط القيمة الرئيسية أثناء فرز المصفوفات حسب قيمها. هاتين الوظيفتين هما () asort و () arsort . تصنف التعليمات البرمجية التالية نفس المصفوفة fruit_preferences $ ولكن يستخدم () asort  للقيام بذلك.

1
<?php
2
3
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];
4
5
echo "Before Sorting — \n";
6
foreach($fruit_preferences as $person=>$preference) {
7
    echo $person." likes ".$preference."\n";
8
}
9
10
/*

11
Before Sorting — 

12
James likes Orange

13
John likes Banana

14
Patricia likes Apple

15
Jennifer likes Mango

16
Mary likes Grapes

17
*/
18
19
asort($fruit_preferences);
20
21
echo "After Sorting  — \n";
22
foreach($fruit_preferences as $person=>$preference) {
23
    echo $person." likes ".$preference."\n";
24
}
25
26
/*

27
After Sorting  — 

28
Patricia likes Apple

29
John likes Banana

30
Mary likes Grapes

31
Jennifer likes Mango

32
James likes Orange

33
*/
34
35
?>

كما يتضح من المثال أعلاه ، فإن قيمة Apple تنتقل إلى الأعلى مع الحفاظ على ارتباطها بـ Patricia. يمكن فرز أسماء الفاكهة في الاتجاه العكسي بسهولة باستخدام الدالة () arsort .

تقبل كل من هاتين الدالتين نفس علامات لتصنيف مثل قيمة العامل الثاني الاختياري الخاص بها مثل () sort  و () rsort.

فرز مصفوفة العناصر حسب القيمة مع وظائف معينة من قبل المستخدم

يمكن لوظائف الفرز الأربعة التعامل بسهولة مع احتياجات الفرز الشائعة الخاصة بك بمساعدة علامات مختلفة. ومع ذلك ، أحيانًا تكون معاييرك لمقارنة عناصر المصفوفة مختلفة.

لنفترض أن لديك مجموعة من الكلمات العشوائية التي يجب فرزها أبجديًا. ومع ذلك ، فأنت تريد أيضًا ترتيبها حسب طولها قبل تصنيفها أبجديًا. على سبيل المثال ، تأتي حديقة الحيوانات (zoo) بعد التفاحة (apple) بالفرز الأبجدي التقليدي. ومع ذلك ، إذا أردت عرض الكلمات القصيرة قبل الكلمات الأطول ، فستظهر حديقة الحيوان (zoo) قبل التفاحة (apple). في نفس مجموعة الأحرف ، سيأتي القرد (ape) قبل حديقة الحيوانات (zoo) بسبب الترتيب الأبجدي.

أساسا ، يتم فرز الكلمات أولا على أساس طولها ، ثم يتم فرز الكلمات مع نفس العدد من الحروف أبجديا ضمن مجموعاتهم الخاصة. هذا النوع من الفرز لا يتم تضمينه في PHP ، لذا سيكون علينا كتابة وظيفة الفرز الخاصة بنا.

إن ما تقدمه PHP في هذه الحالة هو توفير عدد من الوظائف التي يمكن استخدامها لتمرير المصفوفة التي تريد تصنيفها مع اسم وظيفة الفرز الخاصة بك.

يمكنك استخدام الدالة () usort لفرز قيم الصفيف في المصفوفات العادية. وبالمثل ، يمكنك استخدام دالة () uasort لفرز القيم في المصفوفات ذات الصلة ببعضها مع الحفاظ أيضًا على ارتباطات القيمة الرئيسية.

تعرض التعليمات البرمجية المتكررة أدناه إحدى الطرق لإنجاز هذا السلوك.

1
<?php
2
3
$random_words = ["ape", "apple", "zoo", "pie", "elephant", "banana", "picnic", "eye"];
4
5
sort($random_words);
6
echo "Regular Sort Function: \n";
7
foreach($random_words as $element) {
8
    echo str_pad($element, 9)." ";
9
}
10
11
/*

12
Regular Sort Function: 

13
ape       apple     banana    elephant  eye       picnic    pie       zoo

14
*/
15
16
function custom_sort($word_a, $word_b) {
17
    if (strlen($word_a) < strlen($word_b)) {
18
        return -1;
19
    }
20
    if (strlen($word_a) == strlen($word_b)) {
21
        return strcmp($word_a, $word_b);
22
    }
23
    if (strlen($word_a) > strlen($word_b)) {
24
        return 1;
25
    }
26
}
27
28
usort($random_words, "custom_sort");
29
echo "\nCustom Sort Function: \n";
30
foreach($random_words as $element) {
31
    echo str_pad($element, 9)." ";
32
}
33
34
/*

35
Custom Sort Function: 

36
ape       eye       pie       zoo       apple     banana    picnic    elephant

37
*/
38
39
?>

في دوال الإسترجاع الخاصة للفرز المخصص ، يجب علينا إرجاع عدد صحيح أقل من 0 للإشارة إلى أن القيمة الأولى أصغر من الثانية. إرجاع 0 إذا كانت القيمة الأولى تساوي الثانية. قم بإرجاع عدد صحيح أكبر من 0 إذا كانت القيمة الأولى أكبر من الثانية.

نظرًا لأن معايير الفرز الأساسية لدينا كانت طول السلسلة ، فإننا نرجع مباشرةً -1 إذا كانت الكلمة الأولى أقصر من الثانية. وبالمثل ، نرجع مباشرة 1 إذا كانت الكلمة الأولى أطول من الثانية. إذا كانت الكلمتان متساويتين في الطول ، فإننا نقارنهما أبجديًا باستخدام الدالة () strcmp ونرجع قيمته.

كما ترون في الإخراج ، فإن وظيفة الفرز المخصصة تقوم بإعادة ترتيب الكلمات بالطريقة التي أردناها بالضبط.

فرز مصفوفة حسب المفتاح

عادةً ما يكون فرز مصفوفة استنادًا إلى مفاتيحه مفيدًا عند التعامل مع المصفوفات ذات الصلة. على سبيل المثال ، قد يكون لديك مصفوفة تحتوي على معلومات حول العدد الإجمالي للمطارات في مختلف البلدان. بافتراض أن أسماء البلدان المختلفة هي مفاتيح وعدد المطارات هي قيم ، قد ترغب في فرز أسماء البلدان أبجديًا. هذا من السهل جداً القيام به من خلال الوظائف () ksort و () krsort. ستحافظ هاتان الوظيفتان على ارتباط القيمة الرئيسية لعناصر المصفوفة بعد الفرز. تفرز الدالة () ksort المفاتيح من أقل إلى أعلى وتفرز () krsort المفاتيح من أعلى إلى أقل.

في ما يلي مثال لفرز أساسي:

1
<?php
2
3
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];
4
5
ksort($airport_count);
6
7
foreach($airport_count as $country=>$count) {
8
    echo str_pad($country, 15)." ".$count."\n";
9
}
10
11
/*

12
Argentina       1138

13
Bolivia         855

14
Brazil          4093

15
Canada          1467

16
Colombia        836

17
Indonesia       673

18
Mexico          1714

19
Paraguay        799

20
Russia          1218

21
United States   13513

22
*/
23
24
?>

يمكنك أيضًا توفير PHP بدون دالة مخصصة خاصة بك لفرز مفاتيح المصفوفة باستخدام وظيفة ()uksort. تمامًا مثل ()usort ، تتطلب دالة الإسترجاع في ()uksort أيضًا أن تقوم بإرجاع عدد صحيح أقل من 0 إذا كان المفتاح الأول يعتبر أقل من الرقم الثاني وعدد صحيح أكبر من 0 إذا كان المفتاح الأول أكبر من الثاني. تحافظ هذه الوظيفة أيضًا على ارتباط القيمة الرئيسية لعناصر المصفوفة.

1
<?php
2
3
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];
4
5
function custom_sort($word_a, $word_b) {
6
    if (strlen($word_a) < strlen($word_b)) {
7
        return -1;
8
    }
9
    if (strlen($word_a) == strlen($word_b)) {
10
        return strcmp($word_a, $word_b);
11
    }
12
    if (strlen($word_a) > strlen($word_b)) {
13
        return 1;
14
    }
15
}
16
17
uksort($airport_count, "custom_sort");
18
19
foreach($airport_count as $country=>$count) {
20
    echo str_pad($country, 15)." ".$count."\n";
21
}
22
23
/*

24
Brazil          4093

25
Canada          1467

26
Mexico          1714

27
Russia          1218

28
Bolivia         855

29
Colombia        836

30
Paraguay        799

31
Argentina       1138

32
Indonesia       673

33
United States   13513

34
*/
35
36
?>

في المثال أعلاه ، استخدمنا وظيفة الفرز المخصص من القسم السابق لترتيب اسم الدول أولاً حسب طول اسمها ثم أبجديًا.

فرز المصفوفات متعددة الأبعاد في PHP

من الشائع أكثر في الحياة الواقعية التعامل مع المعلومات متعددة الأبعاد. على سبيل المثال ، ستخزن المؤسسات علامات جميع الطلاب في مجموعة متنوعة من الموضوعات في جدول واحد بدلاً من إنشاء جداول جديدة لكل موضوع. إذا كان عليك تخزين نفس المعلومات في PHP ، فإنك تفضل القيام بذلك باستخدام مصفوفة متعددة الأبعاد بدلاً من مصفوفة منفصلة لكل موضوع.

في هذا البرنامج التعليمي ، سوف نتعلم كيفية فرز مصفوفة متعددة الأبعاد باستخدام قائمة من أطول المباني في العالم كمثال. ستحتوي مصفوفتنا على معلومات حول اسم المبنى والمدينة والبلد الذي تقع فيه ، وعدد الطوابق والارتفاع الكلي بالأمتار إلى جانب السنة التي تم فيها البناء.

عندما تريد فرز القيم في مصفوفة متعددة الأبعاد تعتمد على حقل معين ، يمكنك ببساطة استخدام الدالة ()usort. يجب أن يساعدك المثال أدناه على فهم هذه التقنية بشكل أفضل.

1
<?php
2
3
$tallest_buildings = [
4
    ["Building" => "Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates","Height" => 828,"Floors" => 163,"Year" => 2010],
5
    ["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "China","Height" => 632,"Floors" => 128,"Year" => 2015],
6
    ["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia","Height" => 601,"Floors" => 120,"Year" => 2012],
7
    ["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "China","Height" => 599,"Floors" => 115,"Year" => 2017],
8
    ["Building" => "Lotte World Tower","City" => "Seoul","Country" => "South Korea" ,"Height" => 554,"Floors" => 123,"Year" => 2016]
9
];
10
11
function storey_sort($building_a, $building_b) {
12
    return $building_a["Floors"] - $building_b["Floors"];
13
}
14
15
usort($tallest_buildings, "storey_sort");
16
17
foreach($tallest_buildings as $tall_building) {
18
    list($building, $city, $country, $height, $floors) = array_values($tall_building);
19
    echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.\n";
20
}
21
22
/*

23
Ping An Finance Center is in Shenzhen, China. It is 599 meters tall with 115 floors.

24
Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors.

25
Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors.

26
Shanghai Tower is in Shanghai, China. It is 632 meters tall with 128 floors.

27
Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors.

28
*/
29
30
?>

في المثال أعلاه ، يتم تخزين المعلومات حول كل مبنى في المصفوفة الخاصة به داخل مصفوفة tallest_buildings $ الرئيسية. تقوم وظيفة ()storey_sort ببساطة بطرح أرقام الطوابق في المبنى الثاني من الأولى لتحديد المبنى الأصغر وفقًا لمعاييرنا. لا داعي للقلق بشأن إرجاع قيمة سلبية أو إيجابية محددة لأن جميع القيم السلبية تعني أصغر وكل القيم الإيجابية تعني أكبر.

في النهاية ، نكرر فقط من خلال المجموعة الرئيسية ونطبع المعلومات حول كل مبنى.

افكار اخيرة

في هذا البرنامج التعليمي ، عرضت عليك بعض الوظائف المختلفة في PHP والتي يمكن استخدامها لفرز المصفوفات إما من خلال مفاتيحها أو قيمها. كما تعلمنا كيفية فرز مصفوفة من خلال مفاتيحها أو قيمها باستخدام معايير الفرز المخصصة الخاصة بنا بمساعدة وظائف ()uksrot و ()uasort. ناقش القسم الأخير كيفية فرز جميع القيم في مجموعة متعددة الأبعاد باستخدام حقل معين فقط.

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.