2015-08-27 16 views
6

Ho creato 2 semplici esempi:Loop con parentesi graffe fa sì che l'uscita sbagliata

Primo esempio:

<?php $arr = array(1,2,3,4,5); ?> 

<?php foreach ($arr as $element) ?> 
<?php { ?> 
    <?php echo $element; ?> 
<?php } ?> 

uscita:

5 //Is this result wrong? 

Secondo esempio:

<?php $arr = array(1,2,3,4,5); ?> 

<?php foreach ($arr as $element) { ?> 
    <?php echo $element; ?> 
<?php } ?> 

uscita :

12345 

Cosa mi manca della sintassi PHP?

So che esiste una sintassi foreach alternativa, ma a mio parere entrambi gli esempi mostrati dovrebbero risultare nello stesso output. (Codice testato con versione di PHP: 5.6.12)

Edit:

So che i tag non sono necessari in ogni riga. Per essere più precisi: voglio sapere perché i due esempi mi danno 2 risultati diversi?

+0

lo so: D Basta chiedersi il perché di questa uscita ... – Thulur

+0

appena messo alla fine ..... perchè stai usando in ogni riga .. –

+3

Solo a indovinare, ma forse il?> nel primo esempio viene effettivamente preso come fine dell'istruzione (i loop possono essere utilizzati senza parentesi). A quel punto, il ciclo è successo e '$ element' è l'ultimo valore. Quindi le parentesi graffe sono prese come un blocco di codice che tu echi, che è 5. –

risposta

5

Sulla base della uscita, la mia ipotesi è che:

<?php $arr = array(1,2,3,4,5); ?> 

<?php foreach ($arr as $element) ?> 
<?php { ?> 
    <?php echo $element; ?> 
<?php } ?> 

viene interpretato come:

<?php 
$arr = array(1,2,3,4,5); 

foreach ($arr as $element); 
{ 
    echo $element; 
} 
?> 

Sembra un bug nell'interprete? Vedere i commenti per Rizier123:

  1. Non un bug: stackoverflow.com/q/29284075/3933332
  2. Le parentesi dopo il foreach()/Non fare nulla qui /; è solo una dichiarazione-gruppo: php.net/manual/en/control-structures.intro.php

In ogni modo, il codice è atroce con il modo in cui è stato scritto. Si prega di optare per un codice più pulito.


Leggendo i commenti sotto la questione penso Jon Stirling spiegare questo sintomo il migliore:

solo indovinare, ma forse la> nel primo esempio viene effettivamente preso come termine economico (? i loop possono essere utilizzati senza parentesi graffe). A quel punto, il ciclo è successo e $ element è l'ultimo valore. Quindi le parentesi graffe vengono prese come un blocco di codice che viene emesso, ovvero 5.

+1

Non un bug: http://stackoverflow.com/q/29284075/3933332 – Rizier123

+3

+ Le parentesi dopo il 'foreach()/* Non fare nulla qui * /;' è solo un gruppo di istruzioni: http: // php. net/manual/it/control-structures.intro.php – Rizier123

+0

Sono d'accordo con il non fare nulla, ma in questo caso l'elemento $ non dovrebbe essere sconosciuto nelle parentesi graffe? – Thulur

0

Non è necessario utilizzare <?php e ?> ogni singola riga semplicemente fare:

<?php 
$arr = array(1,2,3,4,5); 

foreach ($arr as $element) { 
echo $element; 
} 
?> 

O sintassi alternativa:

<?php 
$arr = array(1,2,3,4,5); 

foreach ($arr as $element) 
{ 
echo $element; 
} 
?> 

O

<?php 
$arr = array(1,2,3,4,5); 

foreach ($arr as $element): 
echo $element; 
endforeach; 
?> 

quando si sta facendo questo:

<?php foreach ($arr as $element) ?> 
<?php { ?> 
    <?php echo $element; ?> 
<?php } ?> 

PHP loop nulla perché vede

foreach ($arr as $element) 
{ 
} 
echo $element; 
+1

È vero, non ne hai bisogno. Ma questo ancora non risponde alla domanda dell'OP. –

0

L'utilizzo di <? php> è un problema.

Si sta completando il contesto foreach prima di emettere il risultato e non farlo nel secondo.

Guarda attentamente i tuoi esempi e dovresti vedere cosa stai facendo in modo diverso.

0

Non so perché utilizzi così tanti tag php, ma è per questo che non funziona! provare questo:

<?php $arr = array(1,2,3,4,5); 

foreach ($arr as $element) 
{ 
    echo $element; 
} ?> 
+0

Non è quello che l'OP chiedeva. Ha chiesto perché l'uso di '{' in una nuova riga ha causato il diverso comportamento. – Bonatti

Problemi correlati