同步迭代平面数组和二维数组,转置行,然后执行除法


Synchronously iterate a flat array and 2d array, transpose the rows, then perform division

>我需要遍历二维数组,访问其列式数据,并对平面数组中的相应值执行除法。

平面数组:

$array1 = [
    'maxwater' => 1,
    'maxfodder' => 2,
    'maxmob' => 3,
    'maxalt' => 4,
    'maxhum' => 5,
    'mintemp' => 6
];

二维数组:

$array2 = [
    [2, 3, 4, 4, 1, 2],
    [3, 2, 1, 4, 1, 3],
    [4, 1, 2, 3, 1, 3],
    [3, 4, 2, 1, 1, 3],
    [1, 2, 2, 2, 3, 3]
];

我在这里要做的只是将$array2的每一列除以$array1中的相应数字。

例如

  • $array1 (maxwater( 中的第一个值为 1 。 这个数字应该用来除以$array2第一列中的每个值(23431(。
  • 那么$array2(maxfodder(中的下一个值是2$array2中的第二列值(32142(应除以2
  • 应对 $array2 中的所有列重复此过程。

我已经尝试使用此代码,但它生成了一个错误:

注意:未定义的偏移量:0 在 C:''xampp''htdocs''Livestockmapping''dsssawprocess.php 在第 42
行警告:在第 42 行的 C:''xampp''htdocs''Livestockmapping''dsssawprocess.php 中除以零0

法典:

$yaxis = sizeof($array2);
$xaxis = max(array_map('count', $array2));
echo $xaxis;
echo $yaxis;
//normalization
for($i=0; $i < $xaxis; $i++)
{
    for($j=0; $j < $yaxis; $j++)
    {
        $c1norm = round($array2[$i][$j]/$array1[$j]);
        echo $c1norm;
    }
}

有人可以帮助我找到正确的方法来做到这一点吗?

编辑:我的第二次编码尝试:

foreach($array1 as $v){
    echo (array_sum(array_column($array2, $v - 1)) / $v) . "<br />";
}

它提供了如下结果:

Array
(
    [0] => 13
    [1] => 6
    [2] => 3.6666666666667
    [3] => 3.5
    [4] => 1.4
    [5] => 2.3333333333333
)

但我想要的是将每个列值划分为$array2,如下所示:

2 / 1 = 2
3 / 1 = 3
4 / 1 = 4
3 / 1 = 3
1 / 1 = 1
3 / 2 = 2
2 / 2 = 1
1 / 2 = 1
4 / 2 = 2
2 / 2 = 1
4 / 3 = 1
1 / 3 = 0
2 / 3 = 1
2 / 3 = 1
2 / 3 = 1

。等等。

现在,您正在根据$array2矩阵划分元素。

包括$array1(每个(的for循环,并将其应用于每列$array2

$array2[$j][$i] 
        ^ column first

例:

// $array1 = array_values($array1); numeric index conversion
$c = count($array1);
$xaxis = sizeof($array2);
$yaxis = max(array_map('count', $array2));
// normalization
for($i = 0; $i < $c; $i++) {
    for($j = 0; $j < ($yaxis - 1); $j++) {
        $c1norm = round($array2[$j][$i] / $array1[$i]);
        echo $c1norm;
    }
}

演示

$indexLevelOne = count($array2);
$indexLevelTwo = count($array2[0]);
// normalization
$k=0;
foreach($array1 as $v){
    for($j=0; $j<$indexLevelTwo; $j++){
        if($j != $k) continue;
        for($i=0; $i<$indexLevelOne; $i++){
            $c1norm = round($array2[$i][$j] / $v);
            echo $array2[$i][$j] . " / " . $v . " = " . $c1norm, "'n";
        }
       echo "'n'n"; 
    }
    echo "'n'n";
    $k++;
}

我将演示一种现代的函数式技术,利用嵌套array_map()调用来同步迭代两个数组并转置多维数组。

通过在将第二个数组传递到array_map()然后再次使用展开运算符接收数据时使用展开运算符,会发生"转置"——换句话说,一列数据变成了一行数据。

代码:(演示(

var_export(
    array_map(
        fn($divisor, ...$column) => array_map(
            fn($v) => round($v / $divisor),
            $column
        ),
        array_values($array1),
        ...$array2
    )
);