Codewars: sort the odd
Codewars: sort the odd
Glossary overview

Codewars: sort the odd

You will be given an array of numbers. You have to sort the odd numbers in ascending order while leaving the even numbers at their original positions.

[7, 1]  =>  [1, 7]
[5, 8, 6, 3, 4]  =>  [3, 8, 6, 5, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  =>  [1, 8, 3, 6, 5, 4, 7, 2, 9, 0]

Solution

<?php

function sortArray(array $arr) : array {
  $sorted = [];
  
  $odds = array_filter($arr, fn($n) => $n % 2 !== 0);
  sort($odds);

  foreach($arr as $n) {
    if ($n % 2 == 0) {
      $sorted[] = $n;
    } else {
      $firstOdd = array_shift($odds);

      $sorted[] = $firstOdd;
    }
  }
    
  return $sorted;
}

var_dump(sortArray([5, 3, 2, 8, 1, 4]));

// Output
array(6) {
  [0]=>
  int(1)
  [1]=>
  int(3)
  [2]=>
  int(2)
  [3]=>
  int(8)
  [4]=>
  int(5)
  [5]=>
  int(4)
}

Чётные позиции остались нетронутыми.
Нечётные отсортировались.

Alternative solution

function sortArray(array $arr) : array {
  $vals = array_filter($arr, fn($v) => $v%2 != 0);
  $keys = array_keys($vals);
  sort($vals);
  return array_replace($arr, array_combine($keys, $vals));
}

Explanation here – array_replace.