Cadenas multilínea en PHP

141

Considerar:

$xml = "l";
$xml = "vv";

echo $xml;

Esto hará eco vv . ¿Por qué y cómo puedo hacer cadenas de varias líneas para cosas como SimpleXML , etc.?

TheBlackBenzKid
fuente
1
¿Desea que haga eco de "l" seguido de "vv" en la línea siguiente?
Mike Samuel
3
Mirar hacia arriba concatenation. Así se llama cuando juntas las cuerdas.
Crashspeeder
14
@haywire Al ser el primer y útil resultado en Google.
Cees Timmerman

Respuestas:

262

Bien,

$xml = "l
vv";

Trabajos.

También puede usar lo siguiente:

$xml = "l\nvv";

o

$xml = <<<XML
l
vv
XML;

Editar basado en el comentario:

Puede concatenar cadenas utilizando el .=operador.

$str = "Hello";
$str .= " World";
echo $str; //Will echo out "Hello World";
El fantasma de Madara
fuente
55
Olvidó si tengo bucles o MySQL mientras bucles entre. Gracias
TheBlackBenzKid
89
@TheBlackBenzKid: Ummm ... ¿Qué?
El fantasma de Madara
1
Ejemplo. while ($ rc = mysql_fetch_array ($ adviews)) {$ xml. = "<set name = '". $ rc ["date"]. "' value = '1' hoverText = '". $ rc ["date" ]. "'/>"; } $ xml. = "</graph>";
TheBlackBenzKid
3
@Pacerier No necesita escapar de las comillas dentro de un heredoc.
El fantasma de Madara
77
@Pacerier Usted preguntó por qué necesitamos molestarnos con heredoc sobre las cotizaciones. Es por eso. Ambas son opciones para cadenas multilínea.
El fantasma de Madara
139

PHP tiene cadenas Heredoc y Nowdoc, que son la mejor manera de manejar cadenas multilínea en PHP.

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
$var is replaced automatically.
EOD;

Un Nowdoc es como un Heredoc, pero no reemplaza las variables.

$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
$var is NOT replaced in a nowdoc.
EOD;

Tenga en cuenta que el token final EODno debe sangrarse en absoluto, o PHP no lo reconocerá. Además, no tiene que usar " EOD"; Puede ser cualquier cadena que desee.

Dan Fabulich
fuente
8
Votado porque siempre me olvido de la sangría.
Matuszek
8
$xml="l" . PHP_EOL;
$xml.="vv";
echo $xml;

Hará eco:

l
vv

Documentación en PHP_EOL .

Ryan
fuente
Favorito @Pacerier
TheBlackBenzKid
¿Hay alguna manera de marcar las respuestas? Siempre pensé que solo podías hacer eso con preguntas. @TheBlackBenzKid
Pacerier
Quise decir que le di un plus +1 mientras lo repetía.
TheBlackBenzKid
@TheBlackBenzKid "favorito";)
Andrés Morales
8

No estoy seguro de cómo se acumula en cuanto al rendimiento, pero para los lugares donde realmente no importa, me gusta este formato porque puedo estar seguro de que está usando \ r \ n (CRLF) y no el formato que sea mi archivo PHP. guardado en.

$text="line1\r\n" .
      "line2\r\n" .
      "line3\r\n";

También me permite sangrar como quiera.

eselk
fuente
5

Otra solución es utilizar el almacenamiento en búfer de salida , puede recopilar todo lo que se emite / hacer eco y almacenarlo en una variable.

<?php
ob_start(); 

?>line1
line2
line3<?php 

$xml = ob_get_clean();

Tenga en cuenta que el almacenamiento en búfer de salida puede no ser la mejor solución en términos de rendimiento y limpieza del código para este caso exacto, pero vale la pena dejarlo aquí como referencia.

Xavi Esteve
fuente
2

Tal vez intente ". =" Indead de "="?

$xml="l";
$xml.="vv";

te dará "lvv";

Norbert Orzechowicz
fuente
1
¿Dijo que el sistema operativo de brujas está usando? Aanswer es completamente como una pregunta;)
Norbert Orzechowicz
Sin embargo, eso no da como resultado una cadena de varias líneas como se solicitó en la pregunta.
ToolmakerSteve
0

Para poner las cadenas "l" y "vv" en líneas separadas solo en el código:

$xml = "l";
$xml .= "vv"
echo $xml;

En este caso, está diciendo que agregue .=la cadena al final de la versión anterior de esa variable de cadena. Recuerde que = es solo un operador de asignación, por lo que en su código original está asignando a la variable un nuevo valor de cadena.

Para poner las cadenas "l" y "vv" en líneas separadas solo en el eco:

$xml = "l\nvv"
echo $xml;

No necesita múltiples cadenas en este caso, ya que el nuevo carácter de línea \nse encargará de eso por usted.

Para poner las cadenas "l" y "vv" en líneas separadas en el código y al hacer eco:

$xml = "l";
$xml .= "\nvv"
echo $xml;
Shawn Solomon
fuente