Сортировка ассоциативного массива с использованием определенной пользователем функции путем сравнения значений элементов одного массива в PHP - PullRequest
0 голосов
/ 11 октября 2018

Я хочу отсортировать элементы массива, сопоставляя TAGS и ITEM_CD. Вот исходный массив, упомянутый ниже

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

, и мне нужен такой вывод

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

У кого-нибудь есть идеи, пожалуйстаскажите, как я могу отсортировать массив таким образом?

1008 * здесь я упомянул пример кода
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);

Ответы [ 2 ]

0 голосов
/ 11 октября 2018
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;
    }
});
0 голосов
/ 11 октября 2018

Обновлено

Хорошо, я думаю, что я исправил это здесь.

При этом будет отсортирован столбец «TAGS», а затем найдены совпадающие значения «TAGS» и «ITM_CD», и они будут помещены в верхнюю часть соответствующей группы «TAGS».

<code>$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 '
';

Будет выведено:

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
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...