Пользовательская сортировка с высоким приоритетом конкретного значения - PullRequest
2 голосов
/ 10 февраля 2020

Я пытаюсь реализовать функцию, которая будет сортировать массив строк в лексическом порядке (без учета регистра). Но с одним исключением: если строка равна, скажем, «bin go!» поставьте эту строку сверху.

Я сделал некоторую функцию, которая хорошо работает с данными тестовых данных. Но я не уверен, что я не обманываю себя особым случаем. Пожалуйста, проверьте меня.

<?php

$a = [
    'alfa', 
    'beta',
    'gama',
    'sigma',
    'foo',
    'bar',
    'bingo!',
];

usort($a, function ($a, $b) {
    $cmp = strcasecmp($a, $b);
    return $cmp == 0
    ? 0
    : (strcasecmp($a, 'bingo!') == 0
            ? -1000
            : (
            strcasecmp($b, 'bingo!') == 0
            ? 1000
            : $cmp
            )
    );
});

var_export($a);

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Решение с usort:

$onTop = 'bingo!';

$array = [
   'alfa', 
   'beta',
   'gama',
   'sigma',
   'foo',
   'bar',
   'bingo!',   
];

usort($array,function($a,$b) use($onTop){
  $r = ($b == $onTop) <=> ($a == $onTop);
  return $r==0 ? strnatcasecmp($a,$b) : $r;
});

var_export($array);

Результат:

array (
  0 => "bingo!",
  1 => "alfa",
  2 => "bar",
  3 => "beta",
  4 => "foo",
  5 => "gama",
  6 => "sigma",
)
1 голос
/ 10 февраля 2020

Вы можете попробовать это следующим образом:

$reserved_keyword = 'bingo!';

$a = [
    'alfa', 
    'beta',
    'gama',
    'sigma',
    'foo',
    'bar',
    'bingo!',
];

$reserved_keyword_key = array_search($reserved_keyword , $a);

unset($a[$reserved_keyword_key]);

natcasesort($a);

array_unshift($a,$reserved_keyword );

var_dump($a);

Для использования в качестве функции:

function order($array , $reserved_keyword){
  unset($array[array_search($reserved_keyword , $array)]);
  natcasesort($array);
  array_unshift($array,$reserved_keyword );
  return $array;
}

Результат:

array(7) {
  [0]=>
  string(6) "bingo!"
  [1]=>
  string(4) "alfa"
  [2]=>
  string(3) "bar"
  [3]=>
  string(4) "beta"
  [4]=>
  string(3) "foo"
  [5]=>
  string(4) "gama"
  [6]=>
  string(5) "sigma"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...