Какой самый элегантный способ сделать «foreach x кроме y» в PHP? - PullRequest
6 голосов
/ 24 апреля 2009

Я хочу сделать что-то вроде этого:

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

}

... без необходимости помещать предложение "if" в тело цикла. Не гарантируется, что «id» будет первым или последним элементом в массиве, и я действительно не хочу сбрасывать или разрезать массив, потому что это будет дорого, некрасиво и не сохранит исходные данные. Мне также обязательно нужно использовать и ключ, и значение внутри цикла.

Есть идеи?

Ответы [ 5 ]

14 голосов
/ 24 апреля 2009

Я не думаю, что предложение 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) {
    #...
5 голосов
/ 24 апреля 2009

Перейти с условием if внутри цикла. В этом нет ничего легкомысленного, его легче всего читать и понимать, и оно наиболее эффективно.

Если вам нужно пропустить много ключей, вы можете создать второй хеш для проверки (в условии if):

foreach ($array as $key => $value) {
   if (array_key_exists($key,$skip_keys)) continue;
   ...
}
2 голосов
/ 24 апреля 2009

Я думаю, что вы всегда будете использовать предложение IF во внутреннем цикле. Из всех опций, которые вы уже дали, я бы использовал только скорость и потребление памяти

1 голос
/ 24 апреля 2009

AFAIK, вы не можете сделать это без if в цикле.

Как говорит ключевое слово, оно «для каждого», а не «для большинства».

РЕДАКТИРОВАТЬ: как soulmerge говорит, что вы могли бы сделать это с array_diff_key(), но если вы пропускаете только один ключ, это более многословно и менее эффективно, чем просто память поместив if в цикл.

0 голосов
/ 17 декабря 2013

Другой способ сжатия оператора if:

// ignore 1,5,8,9
foreach($arr as $key){
  if(in_array($key, array(1,5,8,9)) continue;
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...