Trabalhando com flags em PHP

Agora vamos aprender a trabalhar com flags. Uma flag é uma variável especial que só pode assumir dois valores: true e false. Com as flags, podemos resolver problemas que verificam a ausência de algo: por exemplo, podemos verificar se não há um elemento com um valor específico em um array. Vamos começar.

Vamos resolver o seguinte problema: dado um array com números, verifique se há nele um elemento com o valor 3 ou não. Se houver - exiba '+++', se não - exiba '---'.

Para começar, vamos tentar exibir '+++'. Para isso, vamos percorrer todos os elementos do nosso array e com um 'if' vamos perguntar - o elemento atual é igual ao valor 3? Se for igual - exibimos '+++':

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++';
    }
  }
?>

Mas nossa solução não é muito boa: pois se no array houver não um valor 3, mas vários, então '+++' será exibido várias vezes. Vamos alterar nosso array (fazer dois elementos com o valor 3) e verificar isso:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // exibirá várias vezes
    }
  }
?>

Vamos corrigir o problema: encerraremos o ciclo com break, se o elemento já for encontrado:

php<?php
  $arr = [1, 2, 3, 4, 3, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++';
      break;  // encerra o ciclo
    }
  }
?>

Agora vamos tentar fazer com que, se não houver elementos com o valor 3 no array, seja exibido '---'. Um equívoco comum seria adicionar else ao nosso if - neste caso, '---' será exibido para todos os elementos que não são 3:

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      echo '+++'; // exibirá no elemento 3
    } else {
      echo '---'; // exibirá nos elementos 1, 2, 4, 5
    }
  }
?>

Então, a ideia de adicionar else - é uma ideia ruim, que não funciona. Para resolver problemas desse tipo (tais problemas são bastante comuns) são usadas as chamadas flags.

Como mencionado acima, uma flag é uma variável que pode assumir dois valores: true ou false.

Então, vamos criar uma variável flag com o seguinte significado: se for igual a true, então há um elemento 3 no array, e se for false, então não há tal elemento.

Inicialmente, vamos definir a variável flag como false - ou seja, vamos assumir que o elemento 3 não está no array:

javascript$arr = [1, 2, 3, 4, 5];
$flag = false; // assumimos que o elemento 3 não está no array

Em seguida, iniciaremos um ciclo com um if da mesma forma que fizemos anteriormente. Se o ciclo detectar que no array há um elemento 3 - então definiremos a variável flag como true e sairemos do ciclo com break:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false; // assumimos que o elemento 3 não está no array
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true; // elemento existe - redefinimos a variável $flag
      break; // saímos do ciclo
    }
  }
?>

A resposta para a questão, se há 3 no array ou não, só podemos dar após o ciclo. E essa resposta nós já temos: após o ciclo, a variável flag pode ter permanecido false ou pode ter mudado seu valor para true, se o ciclo detectou 3 no array:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false;
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true;
      break;
    }
  }
  
  // aqui a variável $flag é igual a true ou false
?>

Agora, após o ciclo, podemos fazer um if que verificará a variável flag e exibirá na tela '+++' ou '---':

php<?php
  $arr = [1, 2, 3, 4, 5];
  $flag = false;
  
  foreach ($arr as $elem) {
    if ($elem === 3) {
      $flag = true;
      break;
    }
  }
  
  if ($flag === true) {
    echo '+++';
  } else {
    echo '---';
  }
?>
Задание 1

Dado o array:

php<?php
  $arr = ['a', 'b', 'c', 'd', 'e'];
?>

Verifique se há neste array um elemento 'c'. Se houver - exiba '+++', e se não - exiba '---'.

Задание 2

Escreva um código que verifique se um número é primo ou não. Um número primo é divisível apenas por um e por ele mesmo, e não é divisível por outros números.