Задача: есть ассоциативный массив (ключ, например, имя, а значение цифра), нужно его отсортировать по значению, но не потеряв при этом ключи:
PHP: Сортировка массивов с сохранением ключей
25.01.2021
Не мудрствуя лукаво, ниже код для сортировки массива по возрастанию 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>';