() translation by (you can also view the original English article)
من السهل دائمًا الحصول على معلومات محددة من البيانات المصنفة ، وإلا عليك المرور عبر كل عنصر من المصفوفة في كل مرة. على سبيل المثال ، دعنا نفترض أنك قمت بتخزين درجات الطلاب المختلفين في فصل دراسي في مصفوفة أو جدول. إذا لم يتم فرز البيانات حسب الدرجات التي تم الحصول عليها ، فستضطر إلى إلقاء نظرة على درجة كل طالب في الصف قبل أن تتمكن من معرفة من حصل على أعلى وأقل درجة. إذا كان الجدول قد تم فرزه من الأقل إلى الأعلى على أساس الدرجات ، فإن مجرد النظر إلى درجة الطالب الأول سوف يخبرك بأقل درجة.
الفرز يجعل الكثير من المهام التي تتطلب الوصول إلى أو الحصول على مجموعة محددة من البيانات سهلة للغاية وفعالة. في هذا البرنامج التعليمي ، سوف نتعلم كيفية استخدام وظائف PHP المضمنة لفرز أنواع مختلفة من الصفيف.
فرز مصفوفة حسب القيمة
إن تصنيف مصفوفة بقيمة عناصرها سهل للغاية في PHP. يمكنك اختيار الحفاظ على ارتباطات القيمة الرئيسية أو تجاهلها ، ويمكنك أيضًا تحديد وظائفك الخاصة لإملاء كيفية فرز العناصر. سوف أظهر لك كيف في هذا القسم من البرنامج التعليمي.
يمكنك استخدام دالة (sort(&$array, $sort_flags
لفرز قيم مصفوفة من أقل إلى أعلى. ومع ذلك ، فإنه لن يحافظ على أي صلة رئيسية بين القيم عند فرز المصفوفة. يتم تعيين مفاتيح جديدة للعناصر المفردة بدلاً من إعادة ترتيب بسيطة. تسمح لك العامل الثاني الاختياري بتحديد كيفية فرز العناصر. يمكن أن يكون لها ستة قيم مختلفة:
-
SORT_REGULAR
— سيؤدي هذا إلى فرز القيم دون تغيير أنواعها. -
SORT_NUMERIC
- سيؤدي هذا إلى فرز القيم عن طريق المقارنة بينها رقميًا. -
SORT_STRING
- سيؤدي هذا إلى فرز القيم بمقارنتها كسلسلة. -
SORT_LOCALE_STRING
— سيقارن هذا القيم كسلسلة استنادًا إلى اللغة الحالية. يمكنك تحديث الإعدادات المحلية بنفسك باستخدامsetlocale ()
. -
SORT_NATURAL
- سيؤدي هذا إلى فرز العناصر باستخدام "ترتيب طبيعي" أثناء مقارنتها كسلسلة. -
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
. ناقش القسم الأخير كيفية فرز جميع القيم في مجموعة متعددة الأبعاد باستخدام حقل معين فقط.
آمل أن تكون قد تعلمت شيئًا جديدًا من هذا البرنامج التعليمي. إذا كانت لديك أي أسئلة أو اقتراحات ، فيرجى إبلاغي بها في التعليقات. أفضل طريقة للتعلم هي محاولة إنشاء بعض الأمثلة الخاصة بك ، فرز المصفوفات باستخدام هذه الوظائف.