【问题标题】:Get dimensions of 2D array with respect to size of 1D array获取二维数组相对于一维数组大小的维度
【发布时间】:2016-02-05 05:04:56
【问题描述】:

我有这样的一维数组

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

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

二维数组的维数取决于一维数组的元素个数。

条件

1.二维数组的行数固定为5。

2.列数可能不同。

3.除最后一个元素外,第三行为空

注意

一维数组的大小是可变的。

我们还需要获取二维数组的维度,如何打印呢?

更新

这是我的代码

$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 的值,它是二维数组的列大小

【问题讨论】:

  • 到目前为止你尝试了什么。?投入你的代码努力?
  • 让我更新我的代码。
  • 听起来像是一道作业题
  • @Asperon 对你来说可能是一个简单的家庭作业:)
  • "3.第三行将是空的,除了最后一个元素"。你是说,最后一栏?如果最后一列没有完全完成怎么办?

标签: php arrays algorithm multidimensional-array


【解决方案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);

将 for 循环替换为 foreach ($yourArray as $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

【讨论】:

  • $itemCount =49倒数第二和最后一列在第三行有元素时
【解决方案2】:

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

更新代码:

$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 

【讨论】:

    【解决方案3】:

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

    <?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
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多