通过比较PHP中相同数组的元素值,使用用户定义的函数对关联数组进行排序

I want to sort an array elements by matching TAGS and ITEM_CD.here is source array mentioned below

array(
    array("TAGS" => "98056H","ITM_CD" => 51034),
    array("TAGS" => "98056H","ITM_CD" => 98056),
    array("TAGS" => "98056H","ITM_CD" => 84118),
    array("TAGS" => "96821H","ITM_CD" => 87591),
    array("TAGS" => "96821H","ITM_CD" => 96821)
);

and i want output like that

array(
    array("TAGS" => "98056H","ITM_CD" => 98056),
    array("TAGS" => "98056H","ITM_CD" => 51034),
    array("TAGS" => "98056H","ITM_CD" => 84118),
    array("TAGS" => "96821H","ITM_CD" => 96821)
    array("TAGS" => "96821H","ITM_CD" => 87591),
);

Anyone have idea please tell me how i can sort an array like that?.

here i mentioned sample code

function my_sort($a,$b) {
    if(str_replace('H','',$a['TAGS']) == $b['TAGS']){
        return 1;
    }
    return 0;
}
uasort($new_sort_arr,"my_sort");
print_r($new_sort_arr);

Updated

OK, I think I got it fixed here.

This will sort the "TAGS" column and then will look for matching "TAGS" & "ITM_CD" values and bubble them up to the top of their respective "TAGS" group.

$array = array(

  array("TAGS" => '22222H',"ITM_CD" => 98056),
  array("TAGS" => '98056H',"ITM_CD" => 51034),
  array("TAGS" => '22222H',"ITM_CD" => 22222),
  array("TAGS" => '98056H',"ITM_CD" => 84118),
  array("TAGS" => '96821H',"ITM_CD" => 87591),
  array("TAGS" => '98056H',"ITM_CD" => 98056),
  array("TAGS" => '22222H',"ITM_CD" => 22222),
  array("TAGS" => '96821H',"ITM_CD" => 96821)

);


function order($v){

  if($v > 0){

    return 1;

  }elseif($v < 0){

    return -1;

  }else {

    return 0;

  }

}


usort($array, function($a, $b){
  //Store value of the string compare.
  $v = strcmp($a['TAGS'], $b['TAGS']);

  if($v == 0){ //If 0 then the "Tags" column is ok. Check the "ITM_CD" sort
    //This will sort matching "Tags" & "ITM_CD" to the top.
    return (str_replace('H','', $a['TAGS']) == $b['ITM_CD']) ? 0 : 1;

  }else{
    //The "Tags" column needs sorted.
    return order($v);

  }

});


echo '<pre>';
print_r(array_reverse($array));
echo '</pre>';

This will output:

Array
(
    [0] => Array
        (
            [TAGS] => 98056H
            [ITM_CD] => 98056
        )

    [1] => Array
        (
            [TAGS] => 98056H
            [ITM_CD] => 84118
        )

    [2] => Array
        (
            [TAGS] => 98056H
            [ITM_CD] => 51034
        )

    [3] => Array
        (
            [TAGS] => 96821H
            [ITM_CD] => 96821
        )

    [4] => Array
        (
            [TAGS] => 96821H
            [ITM_CD] => 87591
        )

    [5] => Array
        (
            [TAGS] => 22222H
            [ITM_CD] => 22222
        )

    [6] => Array
        (
            [TAGS] => 22222H
            [ITM_CD] => 22222
        )

    [7] => Array
        (
            [TAGS] => 22222H
            [ITM_CD] => 98056
        )

)
usort($new_sort_arr, function ($a, $b) {
    if ($o = $a['TAGS'] <=> $b['TAGS']) {
        // $o is not 0, meaning the two tags are different, so just return this value
        return $o;
    }

    // both TAGS are identical, sort within one TAG

    $aMatches = rtrim($a['TAGS'], 'H') == $a['ITM_CD'];
    $bMatches = rtrim($b['TAGS'], 'H') == $b['ITM_CD'];

    if ($aMatches == $bMatches) {
        // both match or both don't match, either way, they're equal
        return 0;
    } else if ($a) {
        // a matches, b doesn't, a is higher
        return -1;
    } else {
        // b matches, a doesn't, b is higher
        return 1;
    }
});