在php中填充数组时出现索引错误


Error of index while filling an array in php

第一步是创建一个带有零的新数组。这是代码:

$amounts = [];
    $row = [];
    for($a = 0; $a < count($receipts_with_total); $a++){
        for($b = 0; $b < count($taxes); $b++){
            $row[$b] = 0;               
        }
        $amounts[] = $row;
    }    

然后,我继续用值填充数组。问题是,出于某种原因,我不知道,它添加了一些索引。填充数组的代码是下一个:

//We calculate all the taxes amounts        
    for($i = 0; $i < count($receipts_with_total); $i++){
        $this_receipt = $receipts_with_total[$i];
        //We get all the taxes for each receipt
        $taxes = $this_receipt->taxes;
        for($j = 0; $j < count($taxes); $j++){
            $this_tax = $taxes[$j];             
            if($this_tax->name == "IVA 21%"){
                $amounts[$i][$j] = round((($this_tax->value * $total[$i]) / 100), 2);
            }
            elseif($this_tax->name == "IVA 10.5%"){
                $amounts[$i][$j+1] = round((($this_tax->value * $total[$i]) / 100), 2);
            }
            else {
                $amounts[$i][$j+2] = round((($this_tax->value * $total[$i]) / 100), 2); 
            }           
        }
    }    

输出为:

Creacion

阵列([0]=>阵列([0]=>0[1]=>0[2]=>0)[1]=>阵列([0]=>0[1]=>0[2]=>0

Modelo

阵列([0]=>阵列([0]=>0[1]=>257.46[2]=>61.3)[1]=>阵列([0]=>0[1]=>40.36[2]=>9.61)[2]=>阵列([00]=>80.73[1]=>40.36[2]=>9.61)[3]=>阵列([10]=>211.05[1]=>105.53[2]=>0)

Lleno

数组([0]=>数组([0]=>0[1]=>257.46[2]=>0[3]=>61.3)[1]=>数组([0]=>0[1]=>40.37[2]=>0[3]=>9.61)[2]=>数组>0[2]=>105.53))

第一个输出是带有零的新数组。第二个是一个应该是带有计算数字的最终数组的示例。最后一个是我真正得到的数组。如您所见,粗体索引表示错误。例如,值"61.3"在第一个数组中的第四个位置,而不是第三个位置,这将是正确的。

谢谢!

从代码中删除+1+2。只是

$amounts[$i][$j]=...

在所有情况下。

因为如果,即

$j=2;

它可能在您的代码$j+1 中变成3

我的答案只是选择你问题的那一部分:

问题是,出于某种原因,我不知道,它添加了一些索引。

我想你想显示"IVA 21"总是在子数组的0索引中,"IVA 10.5"总是在个子数组的1索引中,依此类推。。。?所以你不必在索引中+1或+2。。。cuz$j已经在for循环中递增了。。。

或者,如果您不知道哪个先出现,或者以后可能会有更多选择,请不要使用for循环。使用phpforeach并手动保持+1

$j = 0;
foreach ($taxes as $$this_tax) {
    if ($this_tax->name == 'IVA 21%') {
        $amounts[$i][$j] = round((($this_tax->value * $total[$i]) / 100), 2);
    } elseif ($this_tax->name == 'IVA 10.5%') {
        $amounts[$i][$j + 1] = round((($this_tax->value * $total[$i]) / 100), 2);
    } else {
        $amounts[$i][$j + 2] = round((($this_tax->value * $total[$i]) / 100), 2);
    }
   //myabe +3 later...
}

或者,如果你总是知道$tax的长度以及你要把结果放在哪里,为什么不使用0,1,2这样的静态数字呢。你甚至可以创建像这样的cont

define('IVA21', 0); // const IVA21 = 0;
define('IVA105', 1);
// ... more define
//for loop starts
if ($this_tax->name == 'IVA 21%') {
    $amounts[$i][IVA21] = round((($this_tax->value * $total[$i]) / 100), 2);
}