php - 基于行数的透视数组
问题描述
我有以下内容:
$array = array(1,2,3,4,5,6);
我需要“旋转”它以获得:
Array ( [0] => 1 [1] => 4 [2] => 2 [3] => 5 [4] => 3 [5] => 6 )
通过“枢轴”,我的意思是,让我们假设数组存储了一个 2 x 3 矩阵(2 行和 3 列)。我的目标是旋转它,使矩阵现在是 3 x 2 矩阵(3 行,2 列)
当然,我需要一个额外的参数,比如说“行数”(在这种情况下,这就像 2 行)
我做了以下事情:
function pivotArray($array, $nbrRows)
{
$countTotal = count($array);
$countCols = $countTotal / $nbrRows;
$chunk = array_chunk($array,$countCols);
$out = array();
for ($row=0;$row<$nbrRows;$row++) {
for ($col=0;$col<$countCols;$col++) {
$out[$col][$row] = $chunk[$row][$col];
}
}
$arraySingle = call_user_func_array('array_merge', $out);
return $arraySingle;
}
它按设计工作,但我想知道是否有更好的方法来做到这一点?例如避免 2 for 循环?并避免 array_merge ?
解决方案
此代码不是对数组进行几次重新处理,而是构建一个中间数组并基于$position % $countCols
. ceil()
如果有奇数个元素,我还介绍了列数......
function pivotArray($array, $nbrRows)
{
$countTotal = count($array);
$countCols = ceil($countTotal / $nbrRows);
$arraySingle = [];
foreach ( $array as $position => $value ) {
$arraySingle[$position % $countCols][] = $value;
}
return array_merge(...$arraySingle);
}
推荐阅读
- javascript - 如何在 JavaScript 中捕获 iframe src 加载错误?
- tensorflow - keras LSTM:传递了与“cell.state_size”不兼容的“initial_state”
- android - 在 jetpack compose 的底部过度滚动
- django - docker-compose up --build 声明一个错误,但是在我使用 docker-compose up 后它可以工作 什么是给我错误的问题
- angular - Angular slickgrid 列过滤器框对齐问题
- ios - MT5210 本机链接失败 - 无法构建 xamarin.ios(表单)应用程序
- python - 表单未保存在 Django 管理页面中
- delphi - 如何创建将数据从一个单元发送到另一个单元的回调?
- sql - 另一个选择查询中的 MS Access 选择查询,用于选择另一个字段值
- pyzo - 使用pyzo在python的同一目录中使用子程序时出错