2010-12-08 10 views
2

Ich versuche, eine Zeichenfolge aus einer rekursiven Funktion Echo:
echo "<li>", $node, recurse($arr), "</li>";
und
echo "<li>" . $node . recurse($arr) . "</li>";Was bedeutet Komma in Echo-Anweisung?

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

$tree ist eine baumartige Struktur, wie in this question (form2)

finden

Und ich kann feststellen, dass die Ausgabe der beiden unterschiedlich ist.
Kann mir jemand den Unterschied bei der Verwendung von , und . im Allgemeinen und insbesondere in diesem Beispiel sagen?

BEARBEITEN: Was, wenn statt die Strings Echo, ich möchte die Zeichenfolge aus dieser Funktion in einer Variablen gespeichert werden. Ich bin besonders interessiert an der Ausgabe, die von der ersten echo-Anweisung erhalten wurde.

EDIT: Ich Einspeisen dieses Array:

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

Die Ausgänge Ich erhalte wird:
(von erster Echo-Anweisung)

<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> 

(von zweiten Echo statement)

<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

Wie können sie sich unterscheiden? Alles würde wie eine Zeichenkette behandelt werden, bevor es wieder ausgegeben wird ... – BoltClock

+0

Ich habe die Funktion, die ich verwende, das Eingangsarray und das Outpur für zwei Fälle bereitgestellt. Sag mir einfach, es ist kein Fehler auf meiner Seite und eher ein konzeptionelles Problem. :) – Stoic

Antwort

5

EDIT: OK, ich verstehe. Der Schuldige ist Ihre writeList() Funktion. Es gibt eine sekundäre echo innerhalb dieser Funktion.

Wenn Sie dies tun:

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

Jeder Teil wird zuerst ausgewertet und dann ausgedruckt. Es ist äquivalent zu:

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

Aber wenn Sie dies tun:

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

Die gesamte Zeichenfolge aufgebaut ist, die Verkettung Operatoren . zuerst, dann ausgedruckt.Dies bedeutet, writeList($arr) wird zuerst während des Aufbaus der Zeichenfolge aufgerufen, then der äußere echo heißt.

Um dieses Problem zu vermeiden, geben Sie in Ihren Funktionsaufrufen nichts zurück. Erstellen Sie Zeichenfolgen mit dem Verkettungsoperator, und geben Sie sie zurück, sodass Ihre äußere echo diese drucken kann.


was, wenn nicht die Saiten Echo, ich möchte die Zeichenfolge speichern, erzeugt aus dieser Funktion in einer Variablen. Besonders interessiert mich die Ausgabe der ersten Echo-Aussage.

Verwenden Sie die Ausgabepufferung.

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

Aber für diese bestimmte Aussage, warum nicht einfach nur verketten?

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

Ich wollte auch verketten. Aber wie gesagt, die beiden Ausgänge sind hier anders. :( – Stoic

+1

@Stoic: Einfügen der Ausgabe in Ihre Frage. – BoltClock

+0

Fügen Sie die Funktion, Eingabe und Ausgabe für diese. – Stoic

2

echo ist ein Sprachkonstrukt und kann mehrere durch ein Komma getrennte Argumente akzeptieren. Der Effekt ist identisch mit einer verketteten Zeichenfolge.

Der Ausgang sollte nicht anders sein - ich kann nicht an eine Instanz denken, wo es sein könnte.

Bearbeiten: Ah, aber es ist. Das ist, weil Ihre Funktion echo() es Zeug ist. In der ersten Instanz werden <li> und $node ausgegeben; dann der Ausgang der Funktion kommt.

Ich hätte WriteList einfach return Werte rekursiv.

+2

Ich denke an Dinge wie die Art der Ausgabe von diesem Funktionsaufruf erzeugt wird, aber keine Würfel. "echo" innerhalb dieser Funktion gibt nichts zurück, was versehentlich vom äußeren Echo wiedergegeben werden könnte. – BoltClock

+0

Warte, ich glaube, ich habe es genagelt; Sieh meine Antwort. – BoltClock

+0

@BoltClock yeah, ich habe das gleiche gerade hinzugefügt :) –