Как пересчитать вес сортировки?

Идея такая: Есть набор данных в отсортированном варианте:

id|weght
2 | 110
1 | 100
3 | 100

Теперь я хочу, чтобы 3 был выше 2, но при это добавляя к 3 не 20, а 10.

То-есть мне нужно пересчитать все значения, чтобы на выходе получить:

    id|weght
    3 | 110
    2 | 100
    1 | 100

Как написать такую универсальную функцию?)


Ответы (1 шт):

Автор решения: Meow

На скорую руку накатал решение, надеюсь правильно Вас понял.

$array = [
    [
        'id' => 1,
        'weight' => 100
    ],
    [
        'id' => 2,
        'weight' => 110
    ],
    [
        'id' => 3,
        'weight' => 100
    ]
];

$array2 = [
    'id' => 3, // К какому элементу прибавляем вес
    'addedWeight' => 10 // На сколько прибавляем
];

$key = array_search($array2['id'], array_column($array, 'id'));
$array[$key]['weight'] += $array2['addedWeight'];

foreach ($array as $key2 => ['id' => $id, 'weight' => $weight]) {
    if ($key2 !== $key && $weight === $array[$key]['weight']) {
        $array[$key2]['weight'] -= $array2['addedWeight'];
    }
}

usort($array, fn($a, $b): int => $b['weight'] <=> $a['weight']);

Визуализируем

echo 'id|weight' . PHP_EOL;

foreach ($array as ['id' => $id, 'weight' => $weight]) {
    echo $id . '|' . $weight . PHP_EOL;
}

Результат

введите сюда описание изображения

→ Ссылка