根据1D数组的大小获取2D数组的尺寸

时间:2016-02-05 05:04:56

标签: php arrays algorithm multidimensional-array

我有像这样的一维数组

$arr=array('1','2','3','4','5','6','7','8','9','10','11','12','13'......'21');

从此我想创建一个像这样的二维数组。

enter image description here

2D阵列的尺寸取决于1D阵列中的元素数量。

条件

1. 2D阵列的行数固定为5。

2.列数可能会有所不同。

3.除了最后一个元素

之外,第三行将为空

注意

一维数组的大小是多种多样的。

我们需要获得2D数组的尺寸,我该如何打印呢?

更新

这是我的代码

$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数组的列大小

3 个答案:

答案 0 :(得分:1)

试试这个:(编辑:数组解决方案也在下面添加) 我使用了一个模拟数组的循环而不是一维数组。

假设:如果最后一列中有任何项目(例如样本输入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 ($yourArray as $i)替换for循环(或用全部有意义的东西改变$ 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

答案 1 :(得分:1)

您可以使用以下方法生成所需的网格结构。此方法适用于任意大小的数组。

更新了代码:

$arr = array('1','2','3','4','5','6','7','8','9','10', '11');

$arrLength = count($arr);
$columns = ceil($arrLength / 4);
$rows = ($columns == 1) ? (($arrLength > 2) ? $arrLength + 1 : $arrLength) : 5;

echo "Grid dimension: " . $rows . " x " . $columns . "<br />"; 

$output_array = array();
$index = 0;
for($i = 0; $i < $columns; ++$i){
    for($j = 0; $j < $rows; ++$j){
        if($j == 2 && ($i != $columns - 1 || $columns == 1)){
            $output_array[$j][$i] = "*";
            continue;
        }
        $output_array[$j][$i] = isset($arr[$index]) ? $arr[$index] : "";
        ++$index;
    }
}

// display $output_array
for($i = 0; $i < $rows; ++$i){
    for($j = 0; $j < $columns; ++$j){
        echo $output_array[$i][$j] . " ";
    }
    echo "<br />";
}

输出:

Grid dimension: 5 x 3
1 5 9
2 6 10
* * 11
3 7
4 8 

答案 2 :(得分:0)

这适用于任何长度的任何数组:

<?php
$arr=array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21');
$len=count($arr);
$key=0;
$rows=5;
$cols=floor(($len - 2)/4) + 1;
for ($j=0;$j<$cols;$j++)
    for ($i=0;$i<$rows;$i++)                    
        if ($i==2 && $j!=$cols-1) {
            $arr2D[$i][$j] = '*';
        } else {        
            $arr2D[$i][$j] = $key>=$len ? "" : $arr[$key++];
        } 
//print array
echo "<table>";
for ($i=0;$i<$rows;$i++){
    echo "<tr>";
    for ($j=0;$j<$cols;$j++)    
        echo "<td width='30px'>" . $arr2D[$i][$j] . "</td>";  
    echo "</tr>";
}
echo "</table>";
?>

输出:

1   5   9   13  17
2   6   10  14  18
*   *   *   *   19
3   7   11  15  20
4   8   12  16  21