PHP "تحذير:usort() [function.usort]:"وظيفة المقارنة غير صالحة" عند الفرز

StackOverflow https://stackoverflow.com/questions/1229324

سؤال

لدي البيانات التالية كمصفوفة ترابطية

array
  'abc' => 
    array
      'label' => string 'abc' (length=3)
      'weight' => float 3
  'wsx' => 
    array
      'label' => string 'wsx' (length=3)
      'weight' => float 1
  'qay' => 
    array
      'label' => string 'qay' (length=3)
      'weight' => float 1
  'http://test.com' => 
    array
      'label' => string 'http://test.com' (length=15)
      'weight' => float 0
  'Nasi1' => 
    array
      'label' => string 'Nasi1' (length=5)
      'weight' => float 0
  'fax' => 
    array
      'label' => string 'fax' (length=3)
      'weight' => float 4

أريد فرز المصفوفة باستخدام "التسمية" أو "الوزن"

وظيفة المقارنة للتسمية هي:

function compare_label($a, $b)
{
    return strnatcmp($a['label'], $b['label']);
}

ومن مجرد استدعاء الوظيفة من وظيفة أخرى:

usort($label, 'compare_label');
var_dump($label);

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

  • usort($label, 'compare_label'); مع usort($label, compare_label);
  • usort($label, 'compare_label'); مع usort($label, $this->compare_label);

بدون نجاح.يمكن للشخص أن تعطيني تلميحا؟

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

المحلول

لو compare_label هي وظيفة عضو (أي طريقة الفصل) فأنت بحاجة إلى تمريرها بشكل مختلف.

usort( $label, array( $this, 'compare_label' ) );

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

ملحوظة: إذا كانت طريقتك ثابتة، فقم بتمرير اسم الفئة كعنصر أول في المصفوفة

usort( $label, array( __CLASS__, 'compare_label' ) );

نصائح أخرى

هل يتم تعريف وظيفة المقارنة على أنها وظيفة عامة أم كطريقة لكائن؟إذا كانت طريقة، فسيتعين عليك تغيير الطريقة التي تسميها بها قليلاً:

usort($label, array($object, "compare_label")); 

يمكنك أيضًا الإعلان عنها كطريقة ثابتة للفئة نفسها:

public static function compare_label ($a, $b) {
   [...]
}

usort($label, array(Class_Name, "compare_label"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top