PHP - 循环遍历数组,仅在迭代之间的值发生变化时打印出来

6 浏览
0 Comments

PHP - 循环遍历数组,仅在迭代之间的值发生变化时打印出来

非常抱歉如果这个问题已经被提过了,但是我找不到符合我的需求的解决方案。

我在一个PHP 7应用程序中有一个数组,代码如下:

$data = [
    0 => [
        'regulations_label' => 'Europe',
        'groups_label' => 'G1',
        'filters_label' => 'FF1'
    ],
    1 => [
        'regulations_label' => 'Europe',
        'groups_label' => 'G1',
        'filters_label' => 'FF900'
    ],
    2 => [
        'regulations_label' => 'Europe',
        'groups_label' => 'G1',
        'filters_label' => 'FF324234'
    ],
    3 => [
        'regulations_label' => 'Europe',
        'groups_label' => 'G2',
        'filters_label' => 'FF23942'
    ],
    4 => [
        'regulations_label' => 'America',
        'groups_label' => 'G29',
        'filters_label' => 'FF3242'
    ],
    5 => [
        'regulations_label' => 'America',
        'groups_label' => 'G29',
        'filters_label' => 'FF78978'
    ],
    6 => [
        'regulations_label' => 'America',
        'groups_label' => 'G29',
        'filters_label' => 'FF48395043'
    ],
    7 => [
        'regulations_label' => 'Asia',
        'groups_label' => 'G2000',
        'filters_label' => 'FF7'
    ],
    // ...
];

我想要的输出结果如下所示:

Europe

- G1

-- FF1

-- FF900

- G2

-- FF23942

America

- G29

-- FF3242

-- FF48395043

Asia

- G2000

-- FF7

基本上,它只是以结构化格式输出数组,显示`regulations_label`,然后是相应的`groups_label`,最后是`filters_label`。

循环遍历整个数组很简单,例如:

foreach ($data as $d) {
    echo $d['regulations_label'] . "\n";
    echo ' - ' . $d['groups_label'] . "\n";
    echo ' -- ' . $d['filters_label'] . "\n";
}

然而,这会导致`regulations_label`和`groups_label`出现“重复”标题,因为它打印了每个键。但我不知道如何在`foreach`语句中检查是否发生了更改,因为`$d`始终是当前元素。

我试图根据前一个数组键进行检查:

foreach ($data as $key => $d) {
    if ($data[$key-1]['regulations_label'] !== $d['regulations_label']) {
        echo $d['regulations_label'] . "\n";
        echo "-" . $d['groups_label'] . "\n";
    }
}

问题是这样只打印了一个`groups_label`,所以最后可能只有这样的结果:

Europe

- G1

America

...

它不会达到“G2”的部分。

我觉得自己的方法有些奇怪。有人能给出更好的解决方案吗?

背景信息:我在`$data`中接收到的数据是我无法修改的,因为这种格式是用于这种情况的应用程序的一个特性,比如:jQuery load more data on scroll

0
0 Comments

问题的出现原因是需要遍历数组并输出值,但只有在值在迭代之间发生变化时才输出。解决方法是通过记住上一次处理的值,并添加一些条件判断语句来实现。

在给定的示例代码中,首先定义了一个包含多个关联数组的$data数组。然后,使用foreach循环遍历数组中的每个元素$reg。

在循环中,使用条件判断语句来检查上一次处理的值与当前值是否不同。在第一个条件判断中,如果$last_reg与当前元素的'regulations_label'不相等,则输出当前元素的'regulations_label'值,并将$last_reg更新为当前元素的'regulations_label'值。

接下来,在第二个条件判断中,如果$last_grp与当前元素的'groups_label'不相等,则输出当前元素的'groups_label'值。

最后,无论是否满足条件,都会输出当前元素的'filters_label'值。

这样,通过记住上一次处理的值,并在适当的时候输出新的值,就能实现只在值发生变化时才输出的效果。

运行代码后,将得到以下结果:

Europe

- G1

- FF1

- FF900

- FF324234

- G2

- FF23942

America

- G29

- FF3242

- FF78978

- FF48395043

Asia

- G2000

- FF7

这个结果满足了问题的要求,只在值发生变化时才输出。

0
0 Comments

问题出现的原因是在循环遍历数组并打印值时,需要判断值是否在迭代之间发生变化。原始的代码中,使用了if语句来判断值是否发生变化,但是却导致整个输出都被抑制了,而不仅仅是顶层标签。

解决方法是,在判断值是否变化时,只停止相关部分的打印。修改后的代码添加了额外的if语句来实现这一点。同时,为了解决第一行没有$key-1的情况,添加了一个特殊的处理方式。

这个解决方法比使用$group数组的答案引起的问题要少。但是,它会产生一个"Notice: Undefined offset: -1"的错误提示。

这个错误是因为在第一行时,$key的值为0,而$key-1不存在数组索引。

对于这个问题,修改后的演示代码和示例代码已经修复了这个问题。

0
0 Comments

问题出现的原因是需要遍历数组并打印出值,但只有在每次迭代之间值发生变化时才打印出来。

解决方法是使用foreach循环,并通过regulations_label和groups_label进行分组。

具体代码如下:

$group = [];
foreach($data as $v){
  $group[$v['regulations_label']][$v['groups_label']][] = $v['filters_label'];
}

你可以点击这里查看演示。

以上就是问题的原因及解决方法。

0