首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理奇数组项未定义的偏移错误?

如何处理奇数组项未定义的偏移错误?
EN

Stack Overflow用户
提问于 2019-01-25 12:48:26
回答 3查看 57关注 0票数 1

我有一个包含13项的数组,如下所示:

代码语言:javascript
运行
复制
$skus = array(
            "PK 800G",
            "CH 800G",
            "910G",
            "400G",
            "1.5KG",
            "1KG",
            "A 1KG",
            "E 1KG",
            "D 1KG",
            "2 G.",
            "ESSENCE",
            "N 800G.",
            "H 800 G"
);

我的问题是,如果我在数组中有13项,下面的代码会给我错误:

代码语言:javascript
运行
复制
(1/1) ErrorException
Undefined offset: 13

但是如果我从数组中删除一项,并将其设置为"12“,那么它可以很好地工作。我确信这是因为循环。但是我想不出来。

代码语言:javascript
运行
复制
$total = count($skus);
$skuKeys = array_keys($skus);
$iter = ceil($total / 4);

for ($n = 0; $n <= $iter; $n++) {
    $row = ["G", "A"];
    $row2 = ["", ""];
    for ($j = $n*4; $j < 4 * ($n+1); $j++) {
        if ($j == 2) {
            $row = array_merge($row, ["RT + PK","","","","","",""]);
            $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
        }
        $row = array_merge($row, [$skuKeys[$j],"","","","","",""]);
        $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
    }
}

有谁能帮帮我吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-25 14:11:23

你有几个问题。首先,在计算$iter时,需要使用

代码语言:javascript
运行
复制
$iter = floor(($total - 1) / 4);

否则,对于4的倍数的$total,您将在循环中进行多次迭代,并且由于您在外部for循环中使用$n <= $iter,因此您需要使用floor而不是ceil,否则您将在循环中再次进行多次迭代。

您的第二个问题(也是导致错误消息的问题)是,在您的内部for循环中,您没有检查您是否仍然在数组的边界内。因此,在for之后,您需要添加对此的检查:

代码语言:javascript
运行
复制
if ($j == $total) break;

因此,您的代码应更改为:

代码语言:javascript
运行
复制
$iter = floor(($total - 1) / 4);
for ($n = 0; $n <= $iter; $n++) {
    $row = ["G", "A"];
    $row2 = ["", ""];
    for ($j = $n*4; $j < 4 * ($n+1); $j++) {
        if ($j == $total) break;
        if ($j == 2) {
            $row = array_merge($row, ["RT + PK","","","","","",""]);
            $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
        }
        $row = array_merge($row, [$skuKeys[$j],"","","","","",""]);
        $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
    }
}

我怀疑您的代码中还存在其他问题(除非您在循环中对$row$row2做了一些尚未向我们展示的操作),因为您会在每次通过外部循环时覆盖$row$row2的值。但是,这些修复将解决您当前的问题。

票数 1
EN

Stack Overflow用户

发布于 2019-01-25 12:54:34

实际上,您正在处理的array的长度比数组的长度小1。试试..。

代码语言:javascript
运行
复制
$total = count($skus);
$skuKeys = array_keys($skus);
$iter = ceil($total / 4);

for ($n = 0; $n < $iter; $n++) {
    $row = ["G", "A"];
    $row2 = ["", ""];
    for ($j = $n*4; $j < 4 * ($n+1); $j++) {
        if ($j == 2) {
            $row = array_merge($row, ["RT + PK","","","","","",""]);
            $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
        }
        $row = array_merge($row, [$skuKeys[$j],"","","","","",""]);
        $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-01-25 13:58:42

试试这个:

代码语言:javascript
运行
复制
$skus = array(
            "PK 800G",
            "CH 800G",
            "910G",
            "400G",
            "1.5KG",
            "1KG",
            "A 1KG",
            "E 1KG",
            "D 1KG",
            "2 G.",
            "ESSENCE",
            "N 800G.",
            "H 800 G"
);

$total = count($skus);
$skuKeys = array_keys($skus);
$iter = round($total / 4);

for ($n = 0; $n < $iter; $n++) {

    $row = ["G", "A"];
    $row2 = ["", ""];
    for ($j = $n*4; $j < 4 * ($n+1); $j++) {
        if ($j == 2) {
            $row = array_merge($row, ["RT + PK","","","","","",""]);
            $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
        }
        $row = array_merge($row, [$skuKeys[$j],"","","","","",""]);
        $row2 = array_merge($row2, ["TY", "LY", "YTD", "TY", "LY", "MTD", ""]);
    }

}

var_dump($row);
var_dump($row2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54359077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档