Задача: есть ассоциативный массив (ключ, например, имя, а значение цифра), нужно его отсортировать по значению, но не потеряв при этом ключи:

Не мудрствуя лукаво, ниже код для сортировки массива по возрастанию arraySortUp и по убыванию arraySortDown:
function arraySortUp(&$aIn)
{
$iCount = count($aIn);
$aTMP = [];
echo '<pre>';
print_r($aIn);
echo '</pre><hr/>';
foreach($aIn as $key => $val)
{
$aTMP[] = [
'key' => $key,
'val' => $val,
];
}
/*
echo '<pre>';
print_r($aTMP);
echo '</pre><hr/>';
*/
for ($i = 0; $i < $iCount; $i++) {
$iMinVal = $aTMP[$i]['val'];
$iMinPos = $i;
for ($j = $i; $j < $iCount; $j++) {
if ($aTMP[$j]['val'] < $iMinVal) {
$iMinVal = $aTMP[$j]['val'];
$iMinPos = $j;
}
}
if ($iMinPos != $i) {
$iTMP = $aTMP[$i];
$aTMP[$i] = $aTMP[$iMinPos];
$aTMP[$iMinPos] = $iTMP;
}
}
/*
echo '<pre>';
print_r($aTMP);
echo '</pre>';
*/
$aOut = [];
foreach($aTMP as $aTMP2)
{
$aOut[$aTMP2['key']] = $aTMP2['val'];
}
return $aOut;
}
function arraySortDown(&$aIn)
{
$iCount = count($aIn);
$aTMP = [];
echo '<pre>';
print_r($aIn);
echo '</pre><hr/>';
foreach($aIn as $key => $val)
{
$aTMP[] = [
'key' => $key,
'val' => $val,
];
}
for ($i = 0; $i < $iCount; $i++) {
$iMaxVal = $aTMP[$i]['val'];
$iMaxPos = $i;
for ($j = $i; $j < $iCount; $j++) {
if ($aTMP[$j]['val'] > $iMaxVal) {
$iMaxVal = $aTMP[$j]['val'];
$iMaxPos = $j;
}
}
if ($iMaxPos != $i) {
$iTMP = $aTMP[$i];
$aTMP[$i] = $aTMP[$iMaxPos];
$aTMP[$iMaxPos] = $iTMP;
}
}
/*
echo '<pre>';
print_r($aTMP);
echo '</pre>';
*/
$aOut = [];
foreach($aTMP as $aTMP2)
{
$aOut[$aTMP2['key']] = $aTMP2['val'];
}
return $aOut;
}
$aIn = [];
$aIn['a10'] = 10;
$aIn['a1'] = 1;
$aIn['a5'] = 5;
$aIn['a-1'] = -1;
$aIn['a40'] = 40;
$aIn['a30'] = 30;
$aIn['a3'] = 3;
$aIn['a-100'] = -100;
echo '<pre>';
print_r($aIn);
echo '</pre>';
echo '<pre>';
print_r(arraySortDown($aIn));
echo '</pre>';