Алгоритм рулетки

niko42

Новичок
Добрый день.

В моей работе потребывалось сделать постраничную навигацию.
Я написал свой алгоритм и назвал её "Рулетка".

Но есть один минус, не знаю на сколько это будет эфективно, хотелось бы услышать замечания по коду. Спасибо!

PHP:
    /**
    * @see Рулекта
    * @param int $count_page //Количество страниц
    * @param int $page // номер активной страницы
    * @param int $tmp // сколько value нужно вернуть при условии, что $count_page > $tmp
    * @return array
    */
    public static function roulette($count_page = 0, $page = 1, $tmp = 10){

        $count_page = ceil($count_page);

        $arr = array();

        if($page > $count_page){
            return $arr; // или return Ошибку
        }

        for($i = 1; $i <= $tmp; $i++){

            if($count_page > $tmp){
                if($page > $count_page - 5){ // конец рулетки
                    $arr[] = $count_page - $tmp + $i;
                    continue;
                }

                if($page > 5){ // середина рулетки
                    $arr[] = ($page + $i) - 5;
                    continue;
                }
            }

            if($i > $count_page)
                break;

            $arr[] = $i; // начало

        }

        return $arr;

    }
 
Последнее редактирование:

peon

Lok'tar ogar
PHP:
print_r(roulette(10, 2, 2));
Код:
Array ( [0] => 1 [1] => 2 )
А теперь вопрос: зачем это нужно?
 

niko42

Новичок
PHP:
print_r(roulette(10, 2, 2));
Код:
Array ( [0] => 1 [1] => 2 )
А теперь вопрос: зачем это нужно?
Ответ:

Код:
roulette($count_page = 703, $page = 54, $tmp = 20)
Array ( [0] => 50 [1] => 51 [2] => 52 [3] => 53 [4] => 54 [5] => 55 [6] => 56 [7] => 57 [8] => 58 [9] => 59 [10] => 60 [11] => 61 [12] => 62 [13] => 63 [14] => 64 [15] => 65 [16] => 66 [17] => 67 [18] => 68 [19] => 69 )

roulette($count_page = 1, $page = 1, $tmp = 10)
Array ( [0] => 1 )

roulette($count_page = 74, $page = 72, $tmp = 10)
Array ( [0] => 65 [1] => 66 [2] => 67 [3] => 68 [4] => 69 [5] => 70 [6] => 71 [7] => 72 [8] => 73 [9] => 74 )

roulette($count_page = 5, $page = 3, $tmp = 10)
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

roulette($count_page = 1024, $page = 632, $tmp = 50)
Array ( [0] => 628 [1] => 629 [2] => 630 [3] => 631 [4] => 632 [5] => 633 [6] => 634 [7] => 635 [8] => 636 [9] => 637 [10] => 638 [11] => 639 [12] => 640 [13] => 641 [14] => 642 [15] => 643 [16] => 644 [17] => 645 [18] => 646 [19] => 647 [20] => 648 [21] => 649 [22] => 650 [23] => 651 [24] => 652 [25] => 653 [26] => 654 [27] => 655 [28] => 656 [29] => 657 [30] => 658 [31] => 659 [32] => 660 [33] => 661 [34] => 662 [35] => 663 [36] => 664 [37] => 665 [38] => 666 [39] => 667 [40] => 668 [41] => 669 [42] => 670 [43] => 671 [44] => 672 [45] => 673 [46] => 674 [47] => 675 [48] => 676 [49] => 677 )
 

niko42

Новичок
Улучшим код с учетом, того, что слева и справа от числа может быть не по 5 чисел, как взбредет в голову:
PHP:
    /**
    * @see Рулекта
    * @param int $count_page //Количество страниц
    * @param int $page // номер активной страницы
    * @param int $tmp // сколько value нужно вернуть при условии, что $count_page > $tmp
    * @return array
    */
    public static function roulette($count_page = 700, $page = 524, $tmp = 23){

        $count_page = ceil($count_page);

        $arr = array();

        if($page > $count_page){
            return $arr; // или return Ошибку
        }

        $join = floor($tmp / 2);

        for($i = 1; $i <= $tmp; $i++){

            if($count_page > $tmp){
                if($page > $count_page - $join){ // конец рулетки
                    $arr[] = $count_page - $tmp + $i;
                    continue;
                }

                if($page > $join){ // середина рулетки
                    $arr[] = ($page + $i) - $join;
                    continue;
                }
            }

            if($i > $count_page)
                break;

            $arr[] = $i; // начало

        }

        return $arr;

    }

}
Резлуьтатом будет то, что $page = 524 практически распологается по центру массива при условии НЕ четного числа $tmp.
P.s. если $tmp будет четным число, то $page будет распологаеться по центру массива
Код:
Array ( [0] => 514 [1] => 515 [2] => 516 [3] => 517 [4] => 518 [5] => 519 [6] => 520 [7] => 521 [8] => 522 [9] => 523 [10] => 524 [11] => 525 [12] => 526 [13] => 527 [14] => 528 [15] => 529 [16] => 530 [17] => 531 [18] => 532 [19] => 533 [20] => 534 [21] => 535 [22] => 536 )
 

niko42

Новичок
Поразмышляв, я еще упрости код:
PHP:
    /**
     * @see Рулекта
     * @param int $count_page //Количество страниц
     * @param int $page // номер активной страницы
     * @param int $limit // сколько value нужно вернуть при условии, что $count_page > $tmp
     * @return array(int)
     */
    public static function roulette($count_page = 0, $page = 0, $limit = 11){

        $arr = array();

        if($page > $count_page || $count_page <= 0 || $page <= 0 || $limit <= 0){
            return $arr; // или return Ошибку
        }

        $join = floor($limit / 2);
        $tmp = 1;//начало

        if($count_page > $limit){
           if($page > $join && $page < $count_page - $join){
                $tmp = $page - $join;//середина
           }
           elseif($page >= $count_page - $join){
               $tmp = $count_page - $limit + 1;//конец
           }
        }
        else{
            $limit  = $count_page;
        }

        for($i = 0; $i < $limit; $i++){
            $arr[] = $tmp + $i;
        }

        return $arr;
    }
 
Последнее редактирование:
Сверху