我有这样的一维数组
$arr=array('1','2','3','4','5','6','7','8','9','10','11','12','13'......'21');
从这里我想创建一个像这样的二维数组.
2D阵列的尺寸取决于1D阵列中的元素数量.
条件
1.二维数组的行数固定为5.
2.列数可能有所不同.
3.除最后一个元素外,第三行将为空
注意
一维阵列的大小是变化的.
我们需要获得2D数组的维度,我该如何打印它?
UPDATE
这是我的代码
$k=0;
$l=0;
$i=0;
$A=array('1','2','3','4','5','6','7','8','9','10');
//size of 1D array
$size=count($arr);
//2D array
$B=[];
$x=?;//no of columns of 2d array
$y=5;//no of rows of 2d array
for($i=0;$i<$size;$i++){
$B[k][l]=$A[i];
$k++;
if($k==2 && $l!=$x){
$k++;
}
if($k==4){
$l++;
}
}
我怎样才能获得$x的值,它是2D数组的列大小
最佳答案 试试这个:(编辑:数组解决方案也在下面添加)
我使用了一个模拟数组的循环,而不是一维数组.
假设:如果最后一列中有任何项目(例如样本输入10),则最后一列将具有*,而不管到达第3行的项目与否.
$itemCount = 49;
$residual = $itemCount % 4;
$starCount = ceil($itemCount/4);
if ($residual > 1) {
$starCount -= 1;
} else if ($residual) {
$starCount -= 2;
}
$itemsArray = [];
$key = 0;
for ($i = 1 ; $i <= $itemCount ; $i++ ) {
$key = $key % 5 ; // fixing the offset and row number
if ($key == 2 && $starCount) {
$itemsArray[$key][] = '*';
$starCount--;
$key++;
$itemsArray[$key][] = $i;
} else {
$itemsArray[$key][] = $i;
}
$key++;
}
print_r($itemsArray); //check output
测试21,49,50,51.如假设中所述,将显示星号1少于列数.(如果您想通过更改残留检查计数,可以更改它)
注意:我将离开打印部件,因为这取决于您(您希望在命令行或网页上打印它).而且它只是循环结果的问题.
对于此代码的数组版本,您可以放置
$itemCount = count($yourArray);
用foreach替换for循环($yourArray为$i)(或用全部有意义的东西改变$i.)
产量
21
1 5 9 13 17
2 6 10 14 18
* * * * 19
3 7 11 15 20
4 8 12 16 21
49
1 5 9 13 17 21 25 29 33 37 41 45
2 6 10 14 18 22 26 30 34 38 42 46
* * * * * * * * * * * 47
3 7 11 15 19 23 27 31 35 39 43 48
4 8 12 16 20 24 28 32 36 40 44 49
50
1 5 9 13 17 21 25 29 33 37 41 45 49
2 6 10 14 18 22 26 30 34 38 42 46 50
* * * * * * * * * * * *
3 7 11 15 19 23 27 31 35 39 43 47
4 8 12 16 20 24 28 32 36 40 44 48
51
1 5 9 13 17 21 25 29 33 37 41 45 49
2 6 10 14 18 22 26 30 34 38 42 46 50
* * * * * * * * * * * * 51
3 7 11 15 19 23 27 31 35 39 43 47
4 8 12 16 20 24 28 32 36 40 44 48
基于阵列的解决方案供参考
<?php
$itemCount = 21;
$array = range(1,$itemCount);// the 1D array
$residual = $itemCount % 4;
$starCount = ceil($itemCount/4);
if ($residual > 1) {
$starCount -= 1;
} else if ($residual) {
$starCount -= 2;
}
$itemsArray = [];
$key = 0;
foreach ($array as $i) {
$key = $key % 5 ; // fixing the offset and row number
if ($key == 2 && $starCount) {
$itemsArray[$key][] = '*';
$starCount--;
$key++;
$itemsArray[$key][] = $i;
} else {
$itemsArray[$key][] = $i;
}
$key++;
}
print_r($itemsArray); //check output