在PHP中,最优雅的“foreach x except y”方法是什么?

7
我想要做类似这样的事情:
foreach ($array as $key=>$value except when $key="id")
{
// whatever

}

...不需要在循环体内加入“if”语句。不能保证“id”是数组中的第一个或最后一个元素,我也不想取消或切割数组,因为那样会很耗费时间、丑陋,并且无法维护原始数据。而且我肯定需要在循环内使用键和值。

有什么好的想法吗?

5个回答

16

我认为if语句并不是一个问题:

foreach ($array as $key => $value) {
    if ($key == 'ignore_me') continue;
    if ($key == 'ignore_me_2') continue;

如果您想要一个高级的解决方案,可以使用array_diff_key

$loop_array = array_diff_key($actual_array, array('ignore_me' => NULL, 'ignore_me_2' => NULL));
foreach ($loop_array as $key => $value) {
    #...

1
这应该能够运行,但是需要更多的内存,因为它会创建数组的另一份副本。 - Alnitak
是的,已经修改了答案以反映这一点。 - soulmerge
是的,我认为在那种结构中加入这些“continues”是我正在寻找的“整洁”的方式。谢谢! - sanbikinoraion

5
在循环内使用if语句是最简单易懂、最高效的方式,这并不会让代码变得不优雅。如果你需要跳过很多键,可以建立第二个哈希表来进行测试(在if语句中)。
foreach ($array as $key => $value) {
   if (array_key_exists($key,$skip_keys)) continue;
   ...
}

2

我认为你最终会在内部循环中使用IF语句。在你提供的所有选项中,这是我会使用的唯一选项,因为它速度快且内存消耗低。


1
另一种压缩 if 语句的方式是:

// ignore 1,5,8,9
foreach($arr as $key){
  if(in_array($key, array(1,5,8,9)) continue;
  ...
}

1

据我所知,在循环中没有if是做不到的。

正如关键字所说,它是“for each”,而不是“for most”。

编辑:就像soulmerge所说,你可以使用array_diff_key()来实现,但如果你只缺少一个键,那么在循环中加入if比使用array_diff_key()更冗长且内存效率更低。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接