PHP - 循环遍历数组,仅在迭代之间的值发生变化时打印出来
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
问题的出现原因是需要遍历数组并输出值,但只有在值在迭代之间发生变化时才输出。解决方法是通过记住上一次处理的值,并添加一些条件判断语句来实现。
在给定的示例代码中,首先定义了一个包含多个关联数组的$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
这个结果满足了问题的要求,只在值发生变化时才输出。
问题出现的原因是在循环遍历数组并打印值时,需要判断值是否在迭代之间发生变化。原始的代码中,使用了if语句来判断值是否发生变化,但是却导致整个输出都被抑制了,而不仅仅是顶层标签。
解决方法是,在判断值是否变化时,只停止相关部分的打印。修改后的代码添加了额外的if语句来实现这一点。同时,为了解决第一行没有$key-1的情况,添加了一个特殊的处理方式。
这个解决方法比使用$group数组的答案引起的问题要少。但是,它会产生一个"Notice: Undefined offset: -1"的错误提示。
这个错误是因为在第一行时,$key的值为0,而$key-1不存在数组索引。
对于这个问题,修改后的演示代码和示例代码已经修复了这个问题。
问题出现的原因是需要遍历数组并打印出值,但只有在每次迭代之间值发生变化时才打印出来。
解决方法是使用foreach循环,并通过regulations_label和groups_label进行分组。
具体代码如下:
$group = []; foreach($data as $v){ $group[$v['regulations_label']][$v['groups_label']][] = $v['filters_label']; }
你可以点击这里查看演示。
以上就是问题的原因及解决方法。