7

我想做这样的事情:

foreach ($array as $key=>$value except when $key="id")
{
// whatever

}

...无需在循环体中放置“if”子句。不能保证“id”将是数组中的第一个或最后一个元素,我真的不想取消设置或切片数组,因为这将是昂贵的、丑陋的,并且不能维护原始数据。我也绝对需要在循环中同时使用键和值。

有任何想法吗?

4

5 回答 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) {
    #...
于 2009-04-24T09:19:18.690 回答
5

使用循环内的 if 子句。它没有任何不雅之处,它是最容易阅读和理解的,也是最高效的。

如果您有很多键要跳过,您可以构建第二个哈希来测试(在 if 子句中):

foreach ($array as $key => $value) {
   if (array_key_exists($key,$skip_keys)) continue;
   ...
}
于 2009-04-24T09:28:14.033 回答
2

我认为您最终会在内部循环中使用 IF 子句。在您已经提供的所有选项中,这是我唯一会用于速度和内存消耗的选项

于 2009-04-24T09:17:41.377 回答
1

AFAIK 你不能在没有if循环的情况下做到这一点。

就像关键字说的那样,它是“为每个人”,而不是“为大多数人”。

编辑:就像soulmerge说的,你可以用 来做array_diff_key(),但是如果你只是错过了一个键,那么它比仅仅把它if放在循环中更冗长并且内存效率更低。

于 2009-04-24T09:17:41.750 回答
1

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

// ignore 1,5,8,9
foreach($arr as $key){
  if(in_array($key, array(1,5,8,9)) continue;
  ...
}
于 2013-12-16T22:37:24.693 回答