PHP "تحذير:usort() [function.usort]:"وظيفة المقارنة غير صالحة" عند الفرز
-
22-07-2019 - |
سؤال
لدي البيانات التالية كمصفوفة ترابطية
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"));