سؤال

هذا هو حقا الباطنية السؤال, ولكن أنا حقا غريبة.أنا باستخدام usort اليوم لأول مرة منذ سنوات و أنا مهتم بشكل خاص في ما يحدث بالضبط.لنفترض أن لدي مجموعة التالية:

$myArray = array(1, 9, 18, 12, 56);

لا يمكن حل هذه مع usort:

usort($myArray, function($a, $b){
  if ($a == $b) return 0;
  return ($a < $b) ? -1 : 1;
});

أنا لست 100% واضحة حول ما يجري مع المعلمتين $a و $b.ما هي و ماذا تمثل.يعني أنا يمكن أن نفترض أن مبلغ يمثل العنصر الحالي في مجموعة ، ولكن ما هو بالضبط هذا الحصول على مقابل ؟ ما هو $b ؟

أنا يمكن أن تزيد مجموعة تشمل السلاسل:

$myArray = array(
  array("Apples", 10),
  array("Oranges", 12),
  array("Strawberries", 3)
);

وتشغيل التالية:

usort($myArray, function($a, $b){
  return strcmp($a[0], $b[0]);
});

و التي من شأنها أن فرز بلدي الطفل-المصفوفات أبجديا على أساس [0] قيمة المؤشر.ولكن هذا لا نقدم أي وضوح حول ما $a و $b.أنا أعرف فقط أن تتطابق مع نمط أنني تسعى.

شخص ما يمكن أن نقدم بعض الوضوح حول ما هو في الواقع ؟

هل كانت مفيدة؟

المحلول

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

بمجرد أن يكون لديك وسيلة لمقارنة عنصرين، يمكنك استخدامها فرز الخوارزمية - من الاختيار.

إذا كنت غير مألوف، فقد ترغب في النظر إلى كيفية وجود خوارزمية ساذجة بسيطة فقاعة الفرز سوف تستخدم وظيفة المقارنة.

وراء الكواليس، يستخدم PHP quicksort..

نصائح أخرى

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

هذه الطريقة يمكن استخدامها لتسليط الضوء على أي خوارزمية PHP باستخدام.

<?php

$myArray = array(1, 19, 18, 12, 56);

function compare($a, $b) {
    echo "Comparing $a to $b\n";
    if ($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

usort($myArray,"compare");
print_r($myArray);
?>

الإخراج

vinko@mithril:~$ php sort.php
Comparing 18 to 19
Comparing 56 to 18
Comparing 12 to 18
Comparing 1 to 18
Comparing 12 to 1
Comparing 56 to 19
Array
(
    [0] => 1
    [1] => 12
    [2] => 18
    [3] => 19
    [4] => 56
)

من إخراج و تبحث في المصدر يمكننا أن نرى هذا النوع تستخدم في الواقع فرز سريع تنفيذ تحقق زند/zend_qsort.ج في PHP المصدر (ربط نسخة قديمة قليلا ولكن لم تتغير كثيرا).

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

بعض مزيد من البيانية تفسير.

Step 0: (1,19,18,12,56); //Pivot: 18, 
Step 1: (1,12,18,19,56); //After the first reordering
Step 2a: (1,12);         //Recursively do the same with the lesser, here 
                         //pivot's 12, and that's what it compares next if 
                         //you check the output.
Step 2b: (19,56);        //and do the same with the greater

usort () أو uasort () لديك علة شعور الإنسان على نتيجة فرزها. انظر قطاع التعليمات البرمجية:

function xxx($a,$b) { if ($a==$b) return 0; else return $a<$b?-1:1; }
$x=array(1=>10,2=>9,3=>9,4=>9,5=>6,6=>38);
uasort($x,'xxx');
print_r($x);

النتيجه هي:

Array ( [5] => 6 [4] => 9 [3] => 9 [2] => 9 [1] => 10 [6] => 38 )

هل ترى الخطأ؟ رقم؟ حسنا، اسمحوا لي أن أشرح ذلك. الأولية الثلاثة "9" الأصلية ترتيب رئيسي: 2،3،4. ولكن في النتيجة، فإن العناصر الثلاثة "9" هي الآن في الترتيب الرئيسي: 4،3،2، أي عناصر ذات قيمة متساوية في النظام الرئيسي العكسي بعد الفرز.

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

function xxx($a,$b) { if ($a['x']==$b['x']) return 0; else return $a['x']<$b['x']?-1:1; }
$x=array(1=>array('x'=>1, 'v'=>'l'),2=>array('x'=>9, 'v'=>'love'),
       3=>array('x'=>9,  'v'=>'Lara'),4=>array('x'=>9,  'v'=>'Croft'),
       5=>array('x'=>15,  'v'=>'and'),6=>array('x'=>38,  'v'=>'Tombraider'));
uasort($x,'xxx');
print_r($x);

النتيجه هي:

Array ( [1] => Array ( [x] => 1 [v] => l ) [4] => Array ( [x] => 9 [v] => croft ) 
             [3] => Array ( [x] => 9 [v] => Lara ) [2] => Array ( [x] => 9 [v] => love )
             [5] => Array ( [x] => 15 [v] => and ) [6] => Array ( [x] => 38 [v] => Tombraider ) )

هل ترى 'أنا أحب لارا كروفت وتومبريدر"يصبح"أنا كروفت لارا الحب وتومبريدر'.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top