2010-12-08 41 views
2

Je suis en train de faire écho une chaîne à partir d'une fonction récursive:
echo "<li>", $node, recurse($arr), "</li>";
et
echo "<li>" . $node . recurse($arr) . "</li>";que signifie la virgule dans l'instruction echo?

function writeList($tree) 
{ 
    if($tree == null) return; 
    echo "<ul>"; 
    foreach($tree as $node=>$children) { 
     echo "<li>", $node, writeList($children) , "</li>"; 
    } 
    echo "</ul>"; 
} 

$tree est une structure arborescente, comme on se trouve dans this question (form2)

Et, je peux remarquer que la sortie des deux est différente.
Quelqu'un peut-il me dire la différence en utilisant , et . en général, et en particulier, dans cet exemple?

EDIT: si plutôt que faisant écho aux cordes, je veux stocker la chaîne produite à partir de cette fonction dans une variable. Je suis, en particulier, intéressé par la sortie reçue de la première déclaration echo.

EDIT: Je nourrissais ce tableau:

array 
    3 => 
    array 
     4 => 
     array 
      7 => null 
      8 => 
      array 
       9 => null 
     5 => null 
    6 => null 

Les sorties que je reçois est:
(de la première déclaration d'écho)

<ul><li>3<ul><li>4<ul><li>7</li><li>8<ul><li>9</li></ul></li></ul></li><li>5</li></ul></li><li>6</li></ul> 

(de la deuxième déclaration d'écho)

<ul><ul><ul><li>7</li><ul><li>9</li></ul><li>8</li></ul><li>4</li><li>5</li></ul><li>3</li><li>6</li></ul> 
+0

En quoi peuvent-ils différer? Tout serait traité comme une chaîne avant d'être renvoyé ... – BoltClock

+0

J'ai fourni la fonction que j'utilise, la matrice d'entrée et la sortie pour deux cas. Dites-moi, ce n'est pas une erreur de ma part et plutôt une question conceptuelle. :) – Stoic

Répondre

5

EDIT: OK, je comprends. Le coupable est votre writeList() fonction. Il y a un echo secondaire à l'intérieur de cette fonction.

Lorsque vous faites ceci:

echo "<li>", $node, writeList($arr), "</li>"; 

Chaque partie est évalué en premier, puis imprimé. Il est équivalent à:

echo "<li>"; 
echo $node; 
echo writeList($arr); 
echo "</li>"; 

Mais quand vous faites ceci:

echo "<li>" . $node . writeList($arr) . "</li>"; 

La chaîne entière est construit en utilisant les opérateurs de concaténation . d'abord, puis imprimé.Cela signifie writeList($arr) est appelé d'abord pendant la construction de la chaîne, then l'extérieur echo est appelé.

Pour éviter ce problème, ne renvoyez rien dans vos appels de fonction. Créez des chaînes à l'aide de l'opérateur de concaténation, puis renvoyez-les afin que votre echo externe puisse les imprimer.


si plutôt que faisant écho aux cordes, je veux stocker la chaîne produite à partir de cette fonction dans une variable. Je suis, en particulier, intéressé par la sortie reçue de la première déclaration d'écho.

Utiliser la mise en tampon de sortie.

ob_start(); 
echo "<li>", $node, writeList($arr), "</li>"; 
$out = ob_get_clean(); 

Mais pour cette déclaration particulière, pourquoi ne pas simplement concaténer?

$out = "<li>" . $node . writeList($arr) . "</li>"; 
+0

Je voulais concaténer, aussi bien. Mais, comme je l'ai dit, les deux sorties sont différentes ici. :( – Stoic

+1

@Stoic: Collez la sortie dans votre question – BoltClock

+0

Vous avez ajouté la fonction, l'entrée et la sortie pour cela – Stoic

2

echo est une construction de langage et peut accepter plusieurs arguments séparés par une virgule. L'effet est identique à une chaîne concaténée.

La sortie ne doit pas être être différent - je ne peux pas penser à une instance où il pourrait être.

Édition: Ah, mais ça l'est. C'est parce que votre fonction echo() es choses. Dans le premier cas, <li> et $node sont sortis; puis la sortie de la fonction vient.

Je voudrais WriteList simplement return valeurs récursivement.

+2

Je pense à des choses comme quel genre de sortie est générée par cet appel de fonction, mais pas de dés. 'echo' à l'intérieur de cette fonction ne renvoie rien qui puisse être accidentellement répercuté par l'écho externe. – BoltClock

+0

Attendez, je pense que je l'ai cloué; vois ma réponse. – BoltClock

+0

@BoltClock oui, j'ai ajouté la même chose tout à l'heure :) –