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.
