9

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.

3 Answers 3

12

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');
Sign up to request clarification or add additional context in comments.

1 Comment

It's the Q&A format of posting. If you have a problem and come up with a solution, you can post in Q&A format.
4

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'));

2 Comments

Worked for me, even though my sort function was private.
This worked for me as well - my function was private, so I only had to pass my class's namespace. This was for a Dokuwiki plugin, which I think is why I had to do it this way.
3

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() {} );

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.