Niestety, z kawałka kodu który wkleiłeś ciężko wywnioskować co tak właściwie chcesz osiągnąć. Widzę też pewne naleciałości z innych języków.
Ale po kolei:
if ($k > $n) {
echo "Nieprawidłowe dane wejściowe"; }
Słuszne założenie, ale zwykły if i echo nie powstrzymają wywoływania dalszej części skryptu mimo oblania warunku walidacji. Sugeruję jakiś wyjątek, return lub pospolity die/exit.
Nie robi tego co wydaje Ci się, że robi. Właśnie utworzyłeś jednoelementową tablicę zawierającą element $n. W skrócie w PHP jest dynamiczna alokacja pamięci tablic, więc taka deklaracja nie jest kompletnie potrzebna.
for ($i=0; $i<$n; $i++) {
$numbers[$i] = $i + 1;
}
To wszystko da się przede wszystkim zastąpić prostym:
Nie ma potrzeby zaokrąglania wartości zwracanej przez rand. PHP zwraca liczbę całkowitą z podanego przedziału (lub [0 .. getrandmax()] jeśli przedziału nie podasz).
// losowanie k liczb
for ($i=0; $i<$k; $i++) {
// tworzenie losowego indeksu pomiędzy 0 i n - 1
// wybieramy element z losowego miejsca
// przeniesienia ostatniego elementu do miejsca z którego wzięliśmy
$numbers[$r] = $numbers[$n - 1];
//zmniejszamy n
$n--;
}
To również robienie na piechotę tego, co w PHP jest wbudowane. Wystarczy prosta funkcja:
Nie jestem przekonany dlaczego chciałeś sortować dla każdego losowania tablicę $numbers, ale zakładam, że chodziło Ci o posortowanie liczb już wylosowanych. Sortowanie wykonujesz więc tylko raz, na końcu. W skrócie, całość da się zapisać:
<?php
function losuj($k, $n)
{
if ($k > $n) {
die("Nieprawidłowe dane wejściowe"); }
return $random;
}
$k = 9;
$n = 805;
$wylosowane = losuj($k, $n);
?>