2013-07-23 16 views
6

正在检查其他用于对列表值进行排序的方法垂直用于表格中,但其中大部分相当于将表格向右翻转90度。我一直在想办法正确地实现这一点,但我认为我需要一些帮助。在保持表格结构的同时垂直显示表格值

例如,表(水平排列):

a b c d e 
f g h i j 
k l m n o 
p q r 

被重新排序,以(垂直排列):

a e i m p 
b f j n q 
c g k o r 
d h l 

正如你可以看到自上次2个细胞是结构被保留空。

不喜欢这样的:

a e i m q 
b f j n r 
c g k o 
d h l p 

在这个例子中,该表是类似于侧向翻转它。有谁知道如何正确地做到这一点?

+0

你想从数据库中呈现表中的值? –

+0

是的,但是你可以保持简单并且在这个例子中使用一个数组:'array('a','b','c','d','e'...)'。 – enchance

回答

2

编辑:这比我想象的更难,我第一次(或两个)搞砸了。它现在应该工作。

比方说,你已经存储在一个二维数组你的表结构:

$data = array(
    array('a', 'b', 'c', 'd', 'e'), 
    array('f', 'g', 'h', 'i', 'j'), 
    array('k', 'l', 'm', 'n', 'o'), 
    array('p', 'q', 'r') 
); 

既然你想保持相同的“形”,你需要确定表的尺寸。要做到这一点,我们可以取第一行的count,因为我们知道第一行必须是表的最大宽度。高度只是数组中元素的数量。

$width = count($data[0]); // 5 
$height = count($data); // 4 

我们也需要元素的总数,但我们可以高估$ width * $ height。

$total = $width * $height; // 20 

然后,它真的只是一个小数学来计算事情的发展。我们必须为旧的和新的指数使用单独的计数器,因为一旦我们开始出现漏洞,我们将不得不以不同的方式增加它们。

$new_data = array(); 
$j = 0; 
for($i = 0; $i < $total; $i++) { 
    $old_x = floor($i/$width); // integer division 
    $old_y = $i % $width;  // modulo 

    do { 
    $new_x = $j % $height;  // modulo 
    $new_y = floor($j/$height); // integer division 
    $j++; 
    // move on to the next position if we have reached an index that isn't available in the old data structure 
    } while (!isset($data[$new_x][$new_y]) && $j < $total); 

    if (!isset($new_data[$new_x])) { 
    $new_data[$new_x] = array(); 
    } 
    if (isset($data[$old_x][$old_y])) { 
    $new_data[$new_x][$new_y] = $data[$old_x][$old_y]; 
    } 
} 
+0

糟糕,我在第一次发布它之前没有对它进行测试,并且我改变了宽度和高度。该帖子现在已修复。 – seanmk

+0

我试过了,它不起作用。当你的第一行应该是'a i m p'时,你的第一行就会成为'a i m q''。由于第一行是错误的,所以其余行也会移动。另外,行1-3需要有5列,而在你的例子中只有1-2行有5个元素。 – enchance

+0

好吧,我想了解更多,并更新了答案。它现在应该工作。 – seanmk

1

诀窍是为“悬挂”列减去一个。那是最后一行缺少值的列。

// setup some initial test data... rip this out and replace with whatever 
$values = array(); 
for ($x = 0; $x < 18; ++$x) 
    $values[] = chr($x + ord("a")); 

我们可以任意改变列数。行数取决于我们数据的大小除以我们使用的列数。

// change # of columns to desired value 
$columns = 5; 
$rows = (int) ceil(count($values)/$columns); 

某些列挂起。这是该列在最后一行中缺少一个值。

// the number of columns that will "hang" or miss a value in the last row 
$hanging_columns = $columns * $rows - count($values); 

$counter = 0; 
for ($y = 0; $y < $rows; ++$y) { 
    for ($x = 0; $x < $columns; ++$x) { 
    // if we've displayed all values, stop 
    if ($counter++ >= count($values)) break; 

    // calculate the correct index to display 
    $index = ($y + $x * $rows); 
    // if we are in a hanging column, we need to back up by one 
    if ($x > $columns - $hanging_columns) $index -= 1; 

    // display the value 
    echo $values[$index] . " "; 
    } 
    echo "\n"; 
} 
0

这里的另一个解决方案

$unflipped = array('a', 'b', 'c', 'd', 'e', 
       'f', 'g', 'h', 'i', 'j', 
       'k', 'l', 'm', 'n'); 


function flip90($arr, $lineHeight) 
{ 
    $tbl = array(); 

    $index = 0; 
    $counter = 1; 


    for($i = 0; $i < count($arr); $i++) 
    { 
     if($counter > $lineHeight) 
     { 
      $index++; 
      $counter = 1; 
     } 

     if($counter <= $lineHeight) 
     { 
      $tbl[$index][$counter] = $arr[$i]; 

      $counter++; 
     } 

    } 

    return $tbl; 
} 

$flipped = flip90($unflipped, 5); 
echo "<pre>"; 
var_dump($flipped); 
echo "<pre>"; 

功能需要阵列以及测量表格中的行高

相关问题