Die Variante mit dem Array ist eher schlecht, weil für jeden Testwert alle Werte aus dem Zwischenarray getetstet werden und weil das Array-Slice-Konstrukt sehr unübersichtlich zu lesen ist.
Besser wäre den Array am Anfang mit dem niedrigsten Wert aus den ersten zehn Daten zu füllen und eine Testvariable für den Kleinsten der großen Werte zu haben. So braucht man weniger Tests.
Sollte ein Wert auftauchen, der größer als der kleinste der größen Werte ist, würde man den neuen Wert per Schleife an die passende Stelle bubblen lassen.
Ein weiterer Vorteil des Vorgehens ist, dass Vorbereitung des test-Arrays und das Füllen des Testarrays in zwei Bereiche getrennt wird. Unter testgetriebener Entwicklung und unter Beachtung der CleanCode-Regeln würde ich für beide Teile sogar in zwei separate Methoden auslagern, die ich dann durch automatisierte Test abgesichern (bzw. deren Funktion beweisen) würde.
<?php
$arr = array(11, 10, 2, 9);
// höchstens 10 Maximale Werte
$countToFind = ((count($arr) >= 10) ?
10 :
count($arr));
$lastIndexToFind = $countToFind - 1;
// erster Wert wird Basis für gefüllten String
// Bestimmen den kleinensten aus den ersten werten, eventuell weniger als 10?
$test = ((isset($arr[0])) ? $arr[0] : null);
$max = (count($arr) > $countToFind ? $countToFind : count($arr));
for ($i = 1; $i < $max; $i++) {
if ($test > $arr[$i]) {
$test = $arr[$i];
}
}
// Fülle Testarray mit jkleinestn Wert
$out = array_fill(0, $countToFind, $test);
// ueber alle zu sortierenden Werte iterieren
foreach ($arr as $val) {
if ($val > $test) {
$top = true;
for ($i = $lastIndexToFind; $i > 0; $i--) {
if ($out[$i - 1] >= $val) {
$out[$i] = $val;
$test = $out[$lastIndexToFind];
$top = false;
break 1;
}
$out[$i] = $out[$i - 1];
}
// Wenn der Wert der größe ist
if ($top) {
$out[0] = $val;
}
}
}
var_dump($out);
?>
Output
array (size=4)
0 => int 11
1 => int 10
2 => int 9
3 => int 2
Besser wäre den Array am Anfang mit dem niedrigsten Wert aus den ersten zehn Daten zu füllen und eine Testvariable für den Kleinsten der großen Werte zu haben. So braucht man weniger Tests.
Sollte ein Wert auftauchen, der größer als der kleinste der größen Werte ist, würde man den neuen Wert per Schleife an die passende Stelle bubblen lassen.
Ein weiterer Vorteil des Vorgehens ist, dass Vorbereitung des test-Arrays und das Füllen des Testarrays in zwei Bereiche getrennt wird. Unter testgetriebener Entwicklung und unter Beachtung der CleanCode-Regeln würde ich für beide Teile sogar in zwei separate Methoden auslagern, die ich dann durch automatisierte Test abgesichern (bzw. deren Funktion beweisen) würde.
<?php
$arr = array(11, 10, 2, 9);
// höchstens 10 Maximale Werte
$countToFind = ((count($arr) >= 10) ?
10 :
count($arr));
$lastIndexToFind = $countToFind - 1;
// erster Wert wird Basis für gefüllten String
// Bestimmen den kleinensten aus den ersten werten, eventuell weniger als 10?
$test = ((isset($arr[0])) ? $arr[0] : null);
$max = (count($arr) > $countToFind ? $countToFind : count($arr));
for ($i = 1; $i < $max; $i++) {
if ($test > $arr[$i]) {
$test = $arr[$i];
}
}
// Fülle Testarray mit jkleinestn Wert
$out = array_fill(0, $countToFind, $test);
// ueber alle zu sortierenden Werte iterieren
foreach ($arr as $val) {
if ($val > $test) {
$top = true;
for ($i = $lastIndexToFind; $i > 0; $i--) {
if ($out[$i - 1] >= $val) {
$out[$i] = $val;
$test = $out[$lastIndexToFind];
$top = false;
break 1;
}
$out[$i] = $out[$i - 1];
}
// Wenn der Wert der größe ist
if ($top) {
$out[0] = $val;
}
}
}
var_dump($out);
?>
Output
array (size=4)
0 => int 11
1 => int 10
2 => int 9
3 => int 2