проблема с алгоритмом

Discussion in 'PHP' started by Дикс, 3 Mar 2009.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    функция принимает массив с любым кол-вом элементов и кол-во столбцов.

    Возвращает html-таблицу с отсортированными элементами, размещёнными по вертикали.

    Всё отлично пока кол-во столбцов меньше 5.
    Начиная от пяти, при любом раскладе выводится 6 столбцов.


    PHP:
    <?php

    function showTable($elements, $cols = 3){

        
    sort($elements);

        
    $size = sizeof($elements);
        
    $elementsInCol = floor($size/$cols);

        
    $html = "<table border='1'>\n<tr>\n";
        
    $cells = $elementsInCol * $cols;

        for(
    $row = $pos = $i = 0; $i < $cells; $i++, $pos += $elementsInCol)
        {
            if(
    $pos >= $size)
            {
                
    $pos = ++$row;
                
    $html .= "</tr>\n<tr>\n\n";
            }
            
    $html .=  "\t<td>".$elements[$pos]."</td>\n";
        }

        
    $html .= "</tr>\n</table>";

        return 
    $html;
    }

    $cols = 3;
    $elements = array('C', 'A', 'B', 'G', 'H', 'F', 'D', 'E', 'I', 'J', 'Z', 'Y');
    echo 
    showTable($elements, $cols);

    вообще даже на бумаге хрень какая-то.
    допустим есть массив:

    A B C D E F G H I J Y Z - 12 элементов
    делим на 5 столбцов:

    если по 2 элемента в столбце - получается
    A C E G I Y
    B D F H J Z -- 6 столбцов. не влезает.

    если по 3 элемента в столбце:

    A D G J
    B E H Y
    C F I Z -- 4 столбца. 5-ый просто пустой!

    Можно предположить что это правильно, хоть и нерационально.

    Ща буду думать как это сделать
     
    #1 Дикс, 3 Mar 2009
    Last edited: 3 Mar 2009
  2. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    блин, решил.
    забыл заменить

    if($pos >= $size)
    на
    if($pos >= $cells)