PHP: Сортировка массивов с сохранением ключей

25.01.2021

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

pic1

Не мудрствуя лукаво, ниже код для сортировки массива по возрастанию 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>';


Категории: PHP, Алгоритмы
Пометки: Разминка для мозга
Яндекс.Метрика