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

时间:2015-12-10 22:05:23

标签: php arrays indexing

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

Update StatsTable
SET sacks = 2, sackyrds = 5
Where fk_eventID = 123 and teamName = 'St Thomas'

Update StatsTable
SET sacks = 3, sackyrds = 9
Where fk_eventID = 123 and teamName = 'London'

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

$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); 
            }           
        }
    }    

数组([0] =&gt;数组([0] =&gt; 0 [1] =&gt; 0 [2] =&gt; 0)[1] =&gt;数组([0] =&gt; 0 [1] =&gt; 0 [2] =&gt; 0)[2] =&gt;数组([0] =&gt; 0 [1] =&gt; 0 [2] =&gt; 0)[3] =&gt; ;数组([0] =&gt; 0 [1] =&gt; 0 [2] =&gt; 0))

Creacion

数组([0] =&gt;数组([0] =&gt; 0 [1] =&gt; 257.46 [2] =&gt; 61.3)[1] =&gt;数组([0] =&gt; 0 [1] =&gt; 40.36 [2] =&gt; 9.61)[2] =&gt;数组([0] =&gt; 80.73 [1] =&gt; 40.36 [2] =&gt; 9.61)[3] =&gt; ;数组([0] =&gt; 211.05 [1] =&gt; 105.53 [2] =&gt; 0))

Modelo

数组([0] =&gt;数组([0] =&gt; 0 [1] =&gt; 257.46 [2] =&gt; 0 [3] =&gt; 61.3)[ 1] =&gt;数组([0] =&gt; 0 [1] =&gt; 40.37 [2] =&gt; 0 [3] =&gt; 9.61)[2] =&gt;数组([0] =&gt; 80.73 [ 1] =&gt; 0 [2] =&gt; 40.37 [4] =&gt; 9.61)[3] =&gt;数组([0] =&gt; ; 211.05 [1] =&gt; 0 [2] =&gt; 105.53))

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

谢谢!

2 个答案:

答案 0 :(得分:1)

从代码中删除+1+2。 刚

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

在所有情况下。

因为即使是

$j=2;

您的代码3

中可能会$j+1

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

  

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

答案 1 :(得分:0)

我想你想要在子阵列的0索引中始终显示“IVA 21”,并且在子阵列的1索引中始终显示“IVA 10.5”,依此类推......?所以你在索引中没有+1或+2 ... cuz $ j已经在for循环中增加...

或者,如果你不知道哪个先出现,或者你以后会有更多的选择,请不要使用for循环。使用php foreach并手动保持+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...
}

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

这样的conts
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);
}