按列分割3列中的N个元素

时间:2014-01-21 14:56:35

标签: php arrays

我需要将N个元素(1 ... N)写入3列,并且需要获得3个元素值,这些元素在每列中都是最后一个。

我需要得到这个:

 N ... array I need to get
 --------------------
 1 ... array(1)       // or array(1, 1, 1)
 2 ... array(1, 2)    // or array(1, 2, 2)
 3 ... array(1, 2, 3)
 4 ... array(2, 3, 4)
 5 ... array(2, 4, 5)
 6 ... array(2, 4, 6)
 7 ... array(3, 5, 7)
 8 ... array(3, 6, 8)
 9 ... array(3, 6, 9)
10 ... array(4, 7, 10)
11 ... array(4, 8, 11)
12 ... array(4, 8, 12)
13 ... array(5, 9, 13)
...etc

f.e。,如果N = 10,我需要得到结果array(4, 7, 10),输出表将是这样的:

1    5    8
2    6    9
3    7    10
4    

PS: 不喜欢这样:

1    5    9
2    6    10
3    7    
4    8

我编写了这段代码,但它与N = 10有问题。有人可以帮助我,或者在那么大的情况下找到问题吗?或者只是让它变得更简单?很多,非常感谢。

$count_all = 10; // this is N = 10

$count = floor(($count_all - 1) / 3) + 1;

$i = 0;
$j = 1;

echo '<div style="float: left;">';
    for ($k = 1; $k <= 10; $k++) {
        echo '<div style="width: 230px;">';
            echo $k;
        echo '</div>';

        if (
                        (++$i == $count) or
                        (($i == 1) and ($count_all - $i + 1 == $count)) or
                        (($i > 1) and ($count_all - $i == $count)) or
                        ($i + ($j - 1) * $count == $count_all)
        )  {
            echo '</div>';
            echo '<div style="float: left;">';

            $i = 0;
            $j++;
        }
    }
echo '</div>';

3 个答案:

答案 0 :(得分:1)

jsfiddle code is here

它已经准备就绪,可以在javascript中编写逻辑,你可以查看jsfiddle上的代码。

只有区别我使用行而不是列,所以在行的末尾你会看到你的数字加上你也会在弹出警告框中看到它。

逻辑很简单你想要显示所有数字让我们说N = 25它是一个循环来显示1到25之间的数字简单,因为你需要两个变量来打破一个新列(我的情况是一个新行)

2例:

  1. N modulo 3结果0或1
    1. vvN modulo 3 results 2
    2. 你不需要更多:)看看代码我是如何准确计算的。

      你有数字

       var count_all = 11; 
       var m = count_all%3;
       var r = parseInt(count_all/3);
      
       if ((m == 1) || (m == 0)) {
           var first_num = r+m;
           var second_num = first_num + r;
      
        }
      
       if (m == 2) {
             var first_num = r+1;
             var second_num = first_num + r + 1;
        }   
       // let's see the array in an alert box
             alert(first_num.toString() + " " + second_num.toString() + " " +                 count_all.toString());
      
             //now comes visualization
      
           var g = document.createElement('div');
           for (var i=1;i<=count_all; i++) {
               var t=document.createTextNode(i + " ");
               g.appendChild(t);
               $('#divs').append(g);
      
               if ((i==first_num) || (i==second_num)) {
                       //new column (in this case row)
                       var g = document.createElement('div');
                       $('#divs').append(g);
             }   
      
        }
      

答案 1 :(得分:1)

根据您想要的输出,您可以执行以下操作(相应地应用html):

<?php

$n = 10;
$cols = 3;

// Get number of cells in each column
$num_left = $n;
for ($col = 0; $col < $cols; $col++) {
    $num_rows[$col] = ceil($num_left / ($cols - $col));
    $num_left -= $num_rows[$col];
}

$cells = array();

// Add numbers to array
for ($i = 0; $i < $num_rows[0]; $i++) {
    for ($j = 0; $j < $cols; $j++) {
        $cells[$i][$j] = get_cell_number($num_rows, $n, $i, $j);
    }
}

print_r($cells);

function get_cell_number(Array $num_rows, $n, $row, $col) {
    // Make sure cell isn't empty
    if ($row + 1 > $num_rows[$col]) {
        return null;
    }

    // Get number in current cell
    $number = 0;
    for ($i = 0; $i < $col; $i++) {
        $number += $num_rows[$i];
    }
    $number += $row + 1;

    return $number;
}

这将产生一系列行和列,如下所示:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 5
            [2] => 8
        )

    [1] => Array
        (
            [0] => 2
            [1] => 6
            [2] => 9
        )

    [2] => Array
        (
            [0] => 3
            [1] => 7
            [2] => 10
        )

    [3] => Array
        (
            [0] => 4
            [1] => 
            [2] => 
        )

)

如果您只想要每列的最后一个值,您可以这样做:

$cells = array();

foreach ($num_rows as $col => $num) {
    $cells[] = get_cell_number($num_rows, $n, $num - 1, $col);
}

print_r($cells);

哪个输出:

Array
(
    [0] => 4
    [1] => 7
    [2] => 10
)

您也可以更改$n$cols的值。

答案 2 :(得分:1)

因此,这里的基本挑战是将单个阵列拆分为多个阵列。

$column_count = 3; // define number of columns
$start_array = array(1,2,3,4,5,6,7,8,9,10); // your input array
$start_array_size = count($start_array);
$final_array = array(); // array to put stuff into

array_walk($start_array, function($value, $key) use ($column_count, $start_array_size, $final_array) {
    if(!is_int($key)) {
        throw new Exception('Non-numeric key value passed');
    }
    $index = floor(($key*$column_count)/$start_array_size);
    if ($index < 0) $index = 0;
    $final_array[$index] = $value;
});

var_dump($final_array);

这给出了一个类似的数组:

Array(
    [0] => Array(1,2,3,4),
    [1] => Array(5,6,7),
    [2] => Array(8,9,10)
)

因此,在输出表格时,你可以做一些简单的事情:

$max_rows = count($final_array[0]); // first sub-array will always be largest
for($i = 0; $i < $max_rows; $i++) {
    for($j = 0; $j < $column_count; $j++) {
        if(isset($final_array[$i][$j])) {
           $row_string = $final_array[$i][$j] . ' | ';
        }
    }
    $row_string = rtrim('| ', $row_string) . '<br>';
    echo $row_string;
}

显然,您可以使用您需要的任何HTML替换管道分隔符和换行符。