Как алфавитировать от случайного алфавита в PHP

0

Мое задание - отсортировать список слов по алфавиту в php. У меня проблема в том, что алфавит, по которому я сортирую, не является стандартным английским алфавитом. Это случайный порядок из 26 букв, которые я уже сохранил в массиве. Я думаю об использовании usort, но я не уверен, как написать функцию сравнения, которая использует случайный алфавит.

Это то, что я до сих пор

// read in from file
$inFile = fopen($argv[1], "r");
$newOrder = trim(fgets($inFile));
$numWords = fgets($inFile);
$wordList = array();
$i = 0;
// put word list into an array
while(!feof($inFile)){
  $wordList[$i] = fgets($inFile);
  $i++;
}
// split new order into array
$newOrder = explode(" ", $newOrder);
$lastI = count($wordList) - 1;
unset($wordList[$lastI]);
print_r($newOrder);


// write comparator function
function cmpByNewOrder($a, $b){
  global $newOrder;
  $correctOrder = $newOrder;
  $aKey = array_search($a, $correctOrder);
  $bKey = array_search($b, $correctOrder);
  if ($aKey == $bKey){
    return 0;
  }
  return ($aKey < $bKey) ? -1 : 1;
}


print "Original List\n";
for ($i = 0; $i < count($wordList); $i++){
  print trim($wordList[$i]) . "\n";
}
print "\n";

usort($wordList, "cmpByNewOrder");

print "Sorted List\n";
for ($i = 0; $i < count($wordList); $i++){
  print trim($wordList[$i]) . "\n";
}
  • 2
    Пожалуйста, предоставьте некоторый код, показывающий, что вы приложили максимум усилий для самостоятельной реализации этой функции, и запросите помощь по конкретной проблеме, которая запутала вас. Большинство из них не хотят писать код для выполнения чужого домашнего задания. знак равно
Теги:
sorting

1 ответ

0
usort($words, function ($a, $b) /* use ($order) */ {
    // statically initialising custom order; static because of efficiency
    // alternatively, import from outer scope via use() above
    static $order = null;
    if (!$order) {
        $order = array_flip(['f', 'b', 'x', 'i', ...]);
    }

    // iterate every letter in both strings
    for ($i = 0, $length = min(strlen($a), strlen($b)); $i < $length; $i++) {
        // compare the order
        if ($diff = $order[$a[$i]] - $order[$b[$i]]) {
            // if there a difference, return it
            return $diff;
        }
    }

    // both strings were equal so far, let decide on length
    return strlen($a) - strlen($b);
});

Ожидается, что $a и $b будут строками. Обратите внимание, что меня всегда путают, следует ли возвращать <0 или> 0, для которых направление сортировки; вам, возможно, придется поменять местами $a и $b где-нибудь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню