Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP usort() expects parameter 2 to be a valid callback, not in a class

I have a problem with usort not liking the second parameter (the sorting function). I have seen a lot of questions about this being a problem when in a class, and the answer for that is to pass an array of array($this, functionName) But in my case this is not working. The script is not a class, but I am getting this error:

PHP Warning:  usort() expects parameter 2 to be a valid callback, function 'cmp' not found or invalid function name in <filename.php>

So what is the problem with the second parameter, the function name, not being found? This is example code straight from the PHP website.

like image 591
Deltaxfx Avatar asked Jul 06 '16 15:07

Deltaxfx


3 Answers

If the code is not in a class, but you are using a namespace, usort expects the second parameter to have that namespace defined. But not in an array in similar style to using usort in a class.

This worked for me, where 'cmp' is the sorting function:

usort($arrayToSort, 'My\Full\Namespace\cmp');
like image 167
Deltaxfx Avatar answered Nov 03 '22 11:11

Deltaxfx


In case this helps, (&since this is top of Google), I had to do this

class MyObj{
        var $Supplier;
        function cmp($m, $n) {
            if ($m->Supplier == $n->Supplier) {
                return 0;
            }
            return ($m->Supplier < $n->Supplier) ? -1 : 1;
         }
 }
      
 usort($arrayToSort, array('My\Full\Namespace\MyObj', 'cmp'));
like image 23
Mr Heelis Avatar answered Nov 03 '22 11:11

Mr Heelis


I put the callback function inside the function in which I put the usort() and it worked.

function callerFn() {

    if (!function_exists('callbackFn'))   {
        function callbackFn() {}
    }

    usort($arrayToSort, "callbackFn");

}

You can also do it as an unnamed function:

function callerFn() {

    usort($arrayToSort, function() {} );

}
like image 3
Ian Avatar answered Nov 03 '22 11:11

Ian