无法在foreach循环中存储数据,不断循环

时间:2019-04-27 10:06:47

标签: php arrays loops foreach

我正在尝试将特定数据存储到array中,以便以后使用。

我尝试通过键将数据存储在数组中。但是它不断循环的次数远远超过了需要的次数。我设置了一个条件,当row = "configurable"(应该是第5行或第6行)时,它将卸载数据并重新启动。因此,我可以将数据放入“可配置”行,然后重新开始。

我可能完全错了,但是我看不到另一种解决方法。我还尝试过将"For"循环放入Foreach中,但是这给我带来了更多的循环问题。

({$Ptype是在此循环之外声明的值。它应该每4-6行出现一次)

$rowArr = 

[1] => Array
    (
        [0] => 5.5
        [1] => sku123
        [2] => default
        [3] => simple
        [4] => testData4
        [5] => testData5
        [6] => testData6
    )
[2] => Array
    (
        [0] => 5.9
        [1] => sku456
        [2] => default
        [3] => simple
        [4] => testData4
        [5] => testData5
        [6] => testData6
    )

$ rowArr继续大约1000行。我想获取值[1]和[3],并在遇到“ if($ ptype =='configurable')”时放置它们。完成此操作后,我要在$ rowData数组内继续并重复直到再次执行if语句。

因此输出应为(我将对此进行格式化):

[5.5,简单,5.9,简单,...,...]

,然后在满足if语句后应将其删除,以便为新值的使用腾出空间。

   for ($i=1; $i < count($rowArr); $i++) {

    $Data[] = $rowArr[$i][1];
    $Data[] = $rowArr[$i][3];
    // without a "break;" here, it gets too many rows.
}


if($ptype == 'configurable'){

  $dataim = implode("," , $Data);
  echo $dataim . "\n";
  $dataim = "";

      // If I "die;" here, it fills the first row correctly, but it needs to get every row.
  reset($Data);
} 

我也尝试过(我尝试了很多休息时间等)

for ($i=1; $i < count($rowArr); $i++) {

    $Data[] = $rowArr[$i][1];
    $Data[] = $rowArr[$i][3];

    if($ptype == 'configurable'){

        $dataim = implode("," , $Data);
        echo $dataim . "\n";
        $dataim = "";

        reset($Data);
        break;
    } 

}

摘要:

  1. 从另一个数组存储值[1]和[3]

  2. 一旦[3]值是可配置的,则转储数据并在数组中重新开始。无限期继续,直到行完成。

实际结果:

  1. 仅一次又一次地循环前两个值,如果实现了中断,则不会获取任何其他数据。在foreach循环中没有中断,它将永远循环。

  2. 在for循环中使用"die;",它将获取正确的数据,但仅用于第一行。

2 个答案:

答案 0 :(得分:0)

您似乎正在使用Magento的产品,并且想要检索simple个产品中的configurable个产品。

您已采用以下方式

$arr = [
 [5.5,'sku123','default','simple','testData4','testData5','testData6'],
 [5.9,'sku456','default','simple','testData4','testData5','testData6'],
 [5.9,'sku4561','default','configurable','testData4','testData5','testData6'],
 [5.5,'sku123111','default','simple','testData4','testData5','testData6'],
 [5.9,'sku456222','default','simple','testData4','testData5','testData6'],
[5.9,'sku456123','default','configurable','testData4','testData5','testData6'],
];
$data = [];
$records = [];
for($i=0;$i<count($arr);$i++){
 ($arr[$i][3] == 'configurable') ? ($records[$arr[$i][1]] = implode(',',call_user_func_array('array_merge', $data)) AND $data=[]) : ($data[] = [ $arr[$i][1],$arr[$i][3] ]);
}
echo '<pre>';
print_r($records);

输出:

Array
(
 [sku4561] => sku123,simple,sku456,simple
 [sku456123] => sku123111,simple,sku456222,simple
)

答案 1 :(得分:0)

在第一个代码示例中,因为没有中断条件,所以for循环将继续直至到达$ rowArr的末尾。

在第二个代码示例中,循环过早结束,因为一旦$ ptype是“可配置的”,循环就不会再次开始。

我用自己的$ rowArr做了一些测试,也许下面的代码会帮助您。

$configurable = ["l", "w"];

$rowArr = array(
    ["not-configurable", "a", "b", "c"],
    ["not-configurable", "d", "e", "f"],
    ["not-configurable", "g", "h", "i"],
    ["configurable", "j", "k", "l"],
    ["not-configurable", "m", "n", "o"],
    ["not-configurable", "p", "r", "s"],
    ["configurable", "t", "u", "w"],
    ["not-configurable", "x", "y", "z"]
);

for ($i=0; $i < count($rowArr); $i++) {

    $Data[] = $rowArr[$i][1];
    $Data[] = $rowArr[$i][3];

    if(in_array($rowArr[$i][3], $configurable)) {

        $dataim = implode("," , $Data);
        echo $dataim . "\n";
        $dataim = "";

        reset($Data);
        array_splice($rowArr, $i, 1);
        $i = -1;

    } 
}

希望我能正确理解您要实现的目标。