"{" = True I am trying to set up a PHP function usortto change the sort order of...">

PHP - changing the sort order of characters, for example, "a"> "{" = True

I am trying to set up a PHP function usortto change the sort order of characters.

Currently, the symbol character " *" is equal to a value smaller than alphabetic characters, for example. " a", i.e. "*" < "a" = TRUE. Other characters, such as " {", have values ​​that exceed letters, for example. " a", i.e. "{" < "a" = FALSE.

I would like to sort so that the value " {*}" is at the top of the sorted array, as if the value were " *". Here we use the function that I am currently using to sort an array of objects by several properties of the objects. [Attribution: This is a modified version of the Shaver code for usort documents .]

function osort($array, $properties) {
    //Cast to an array and specify ascending order for the sort if the properties aren't already
    if (!is_array($properties)) $properties = [$properties => true];

    //Run the usort, using an anonymous function / closures
    usort($array, function($a, $b) use ($properties) {
        //Loop through each specified object property to sort by
        foreach ($properties as $property => $ascending) {
            //If they are the same, continue to the next property
            if ($a -> $property != $b -> $property) {
                //Ascending order search for match
                if ($ascending) {
                    //if a property is greater than b, return 1, otherwise -1
                    return $a -> $property > $b -> $property ? 1 : -1;
                }
                //Descending order search for match
                else {
                    //if b property is greater than a's, return 1, otherwise -1
                    return $b -> $property > $a -> $property ? 1 : -1;
                }
            }
        }
        //Default return value (no match found)
        return -1;
    });

    //Return the sorted array
    return $array;
}
+4
source share
1 answer

How about a usortone that prioritizes certain characters in the order you specify and subsequently uses regular ones strcmp?

Something like that:

<?php

$list = [ 'abc',
      '{a}',
      '*',
      '{*}',
      '{abc',
      '}a',
    ]; // An array of strings to sort

$customOrderPrioritized = ['{','*','}']; // Add any characters here to prioritize them, in the order they appear in this array

function ustrcmp($a, $b, $customOrderPrioritized) {
    if ($a === $b) return -1; // same, doesn't matter who goes first

    $n = min(strlen($a), strlen($b)); // compare up to the length of the shortest string
    for ($i = 0; $i < $n; $i++) {
        if ($a[$i] === $b[$i]) continue; // matching character, continue to compare next

        $a_prio = in_array($a[$i], $customOrderPrioritized);
        $b_prio = in_array($b[$i], $customOrderPrioritized);

        // If either one has a prioritized char...
        if ($a_prio || $b_prio) {
            if ($a_prio && $b_prio) {
                // Both are prioritized, check which one is first...
                return array_search($a[$i], $customOrderPrioritized) <= array_search($b[$i], $customOrderPrioritized) ? -1 : 1;
            } elseif ($a_prio) {
                return -1; // a < b
            } else { // must be $b_prio
                return +1; // b > a
            }
        }
        return strcmp($a[i], $b[$i]); // compare single character
    }
    // if they have identical beginning, shortest should be first
    return strlen($a) <= strlen($b) ? -1 : +1;
}

usort(
    $list, 
    function($a, $b) use ($customOrderPrioritized){
        return ustrcmp($a, $b, $customOrderPrioritized);        
    }
); // run custom comparison function, pass in $customOrderPrioritized (or make it global)

print_r($list); // print the list

/* The sorted array should look like:
Array
(
    [0] => {*}
    [1] => {a}
    [2] => {abc
    [3] => *
    [4] => }a
    [5] => abc
)
*/
0
source

Source: https://habr.com/ru/post/1669508/


All Articles