0

I have an array which looks like

[0] => Array
    (
        [typeName] => Element
        [quantity] => 35
        [flag] => 4
    )

I already found a way by using usort() to sort an array by its sub elements. Which works great for numeric values.

public static function _sortByAmount($a, $b) {
        return $b['quantity'] - $a['quantity'];
}

From time to time, it could happen that I have more than one array elements with the same quantity. Those entries should be sorted by the Name too. In the end, the array should look like this.

[0] => Array
    (
        [typeName] => Element
        [quantity] => 567
        [flag] => 4
    )
[1] => Array
    (
        [typeName] => aaa-element
        [quantity] => 35
        [flag] => 4
    )
[2] => Array
    (
        [typeName] => bbb-element
        [quantity] => 35
        [flag] => 4
     )
[3] => Array
    (
        [typeName] => Element
        [quantity] => 10
        [flag] => 4
    )

Is it possible to extend my function somehow?

2 Answers 2

1

You can check anything you want in your compare function. For example, if quantity == quantity then return strcmp.

public static function _sortByAmount($a, $b) {
    if($b['quantity'] == $a['quantity']){
        return strcmp($a['typeName'], $b['typeName']);
    } else {
        return $b['quantity'] - $a['quantity'];
    }
}

you can also use strcasecmp if you want the check to be case insensitive.

Sign up to request clarification or add additional context in comments.

Comments

1

not sure, but

public static function _sortByAmount($a, $b) {
        $byQuantity = $a['quantity'] - $b['quantity'];
        return $byQuantity ?: strcmp($a['typeName'], $b['typeName']);
}

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.