Как распределить позицию элемента в формате топа

Рейтинг: 1Ответов: 1Опубликовано: 23.01.2023

Нужно распределить позицию в топе (максимум ТОП-5) согласно табличному значению. Размер входного массива может быть разный.

Сейчас составил только такое решение, которое выглядит неоптимально:

$arr = [["ID" => 1],["ID" => 2],["ID" => 3],["ID" => 4],["ID" => 5],["ID" => 6],["ID" => 7],["ID" => 8],["ID" => 9],["ID" => 10]];

$topOne = round((count($arr) * (10 / 100))); // TOP 1 = 10% от всех позиций
$topTwo = round((count($arr) * (20 / 100)));  // TOP 2 = 20% от всех позиций
$topThree = round((count($arr) * (20 / 100)));  // TOP 3 = 20% от всех позиций
$topFore = round((count($arr) * (20 / 100)));  // TOP 4 = 20% от всех позиций
$topFive = round((count($arr) * (30 / 100))); // TOP 5 = 30% от всех позиций

$step = 0;
for ($i = $step; $i < $topOne; $i++) {
    $arr[$i] = ["TOP_POSITION" => 1];
    $step++;
}
$next = $step + $topTwo;
for ($i = $step; $i < $next; $i++) {
    $arr[$i] = ["TOP_POSITION" => 2];
    $step++;
}
$next = $step + $topThree;
for ($i = $step; $i < $next; $i++) {
    $arr[$i] = ["TOP_POSITION" => 3];
    $step++;
}
$next = $step + $topFore;
for ($i = $step; $i < $next; $i++) {
    $arr[$i] = ["TOP_POSITION" => 4];
    $step++;
}
$next = $step + $topFive;
for ($i = $step; $i < $next; $i++) {
    $arr[$i] = ["TOP_POSITION" => 5];
    $step++;
}

Ответы

▲ 1Принят

Немного оптимизировал и автоматизировал Ваш вариант. Теперь количество топов не имеет значения.

<?php
$arr = [["ID" => 1],["ID" => 2],["ID" => 3],["ID" => 4],["ID" => 5],["ID" => 6],["ID" => 7],["ID" => 8],["ID" => 9],["ID" => 10]];

$top_positons = [10, 20, 20, 20, 30];
$len = count($arr);

$tops = [];

foreach($top_positons as $top){
    $tops[] = round($len * ($top/100));
}

for($i=0, $step=0, $level=1; $i<$len; $i++, $step++){
    if($tops[$level-1] <= $step){
        $step = 0;
        $level++;
    }
    $arr[$i] = ["TOP_POSITION" =>$level];

}