Jump to content
rikardinhuh

foreach

Recommended Posts

rikardinhuh

boas,o meu problema é:

já olhei para vários codigos e nao consigo perceber o foreach, Se alguem tivesse a paciencia de me explicar ficaria muito agradecido :P

cumps

Share this post


Link to post
Share on other sites
brunoais

Já pesquisaste e leste o manual de instruções?

http://lmgtfy.com/?q=php+foreach&l=1


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rikardinhuh

Sim já fiz research , e acredita que se estou a perguntar é porque nao percebo mesmo =s... Pelo que tenho visto as pessoas usam facilmente, o que me dá a entender que é facil, mas é muito diferente de um for, entao nao dou uma pa caixa O.o

obrigado :P

Share this post


Link to post
Share on other sites
yoda

Muito diferente? A única diferença é que num ciclo for podes controlar mais facilmente (porque no foreach também se consegue mas não é tão óbvio) os ponteiros.

foreach = for each = por cada

Basta experimentar uma vez que ficas a perceber o método de funcionamento, não tem magia absolutamente nenhuma.

$marcas = array('sagres', 'super bock', 'cintra');

foreach($marcas as $marca)
{
  // $marca é o ponteiro actual
}

// ou

foreach ($marcas as $key=>$marca)
{
  // $key é o index do ponteiro, $marca é o valor associado a esse index
  // $key e $marca são variáveis temporárias, podes escolher os nomes que quiseres, e.g. $helena => $coelho
}

Share this post


Link to post
Share on other sites
rikardinhuh

Sim ja percebi, mas reparei que vai dar ao mesmo usando das duas formas, qual é a diferença?  ou quando devo usar duma forma ou de outra? =S

Share this post


Link to post
Share on other sites
yoda

Sim ja percebi, mas reparei que vai dar ao mesmo usando das duas formas, qual é a diferença?  ou quando devo usar duma forma ou de outra? =S

O ciclo for usa indexes numéricos para avançar, e podes "facilmente" saltar de ponteiro em ponteiro sem ser por ordem de entrada, como por exemplo saltar de 2 em 2, ou do fim para o início. O ciclo foreach usa ambos (numérico ou string), e é um pouco mais restritivo / complicado de manusear em termos de indexes.

Pessoalmente não uso o ciclo for à mais de 2 anos, porque não precisei dele, mas tem a sua utilidade.

Share this post


Link to post
Share on other sites
mjamado
Sim ja percebi, mas reparei que vai dar ao mesmo usando das duas formas, qual é a diferença?  ou quando devo usar duma forma ou de outra? =S

A grande vantagem acaba por ser na qualidade de entendimento do código que escreves, sobretudo quando já tens ciclos dentro de ciclos. Vamos imaginar, por um momento, que tens um canal de notícias, com categorias e comentários, e que queres apresentar alguns desses registos duma forma sequencial e organizada; depois de construíres um array associativo com categorias, notícias dentro de cada categoria e comentários dentro de cada notícia, a maneira de os apresentar seria a seguinte:

// com ciclos for
for($i = 0; $i < count($categorias); $i++)
{
  // apresentação da categoria, com echo ou HTML, whatever

  for($j = 0; $j < count($categorias[$i]['noticias']); $j++)
  {
    // apresentação da notícia

    for($k = 0; $k < count($categorias[$i]['noticias'][$j]['comentarios']); $k++)
    {
      // apresentação do comentário - repara na complexidade:
      echo $categorias[$i]['noticias'][$j]['comentarios'][$k]['autor'] . '<br />';
      echo $categorias[$i]['noticias'][$j]['comentarios'][$k]['texto'];
    }
  }
}

// com ciclos foreach
if(!empty($categorias))
{
  foreach($categorias as $categoria)
  {
    // apresentação da categoria

    if(!empty($categoria['noticias']))
    {
      foreach($categoria['noticias'] as $noticia)
      {
        // apresentação da notícia

        if(!empty($noticia['comentarios'])
        {
          foreach($noticia['comentarios'] as $comentario)
          {
            // apresentação do comentário - agora repara:
            echo $comentario['autor'] . '<br />';
            echo $comentario['texto'];
          }
        }
      }
    }
  }
}

Repara que parece mais código, mas é sobretudo por causa dos if (são necessários, porque o foreach dá granel se o array estiver vazio), mas, conforme o código for crescendo, vais reparar que acaba por ser menos código, devido às linhas curtas para aceder às propriedades, nos vários níveis.

Como bónus adicional, se precisares de esmifrar uns milissegundos à tua aplicação, os ciclos foreach são cerca de 30% mais rápidos do que os ciclos for.

Finalmente, e tal como disse o yoda, embora de uma forma pouco clara, há situações onde é impossível usar um ciclo for, como quando é um array puramente associativo, isto é, com índices não numéricos. Por exemplo, para efeitos de debug ou logging, podes precisar de ver tudo o que vem num request:

if(!empty($_REQUEST))
{
  foreach($_REQUEST as $nome => $valor)
  {
    echo $nome . ' = ' . $valor . '<br />';
  }
}


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
taviroquai

Explique lá bem isso...  :P

Vantagens e desvantagens de ambos:

For

Vantangens:

1. especificar o inicio do ciclo

2. especificar a condição de paragem

3. especificar o salto entre items

Desvantagens:

1. É mais lento

2. precisa de 3 argumentos

Foreach:

Vantagens:

1. É mais rápido

2. precisa de menos argumentos

3. fácil obter cada item do array

Desvantagens:

1. Não é possivel especificar o inicio

2. Não é possivel especificar o salto

3. Não é possivel especificar o fim

4. Devolve erro se a variavel do 1º argumento não for um array

Tudo tem vantagens e desvantagens...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.