สตริงหลายบรรทัดใน PHP


153

พิจารณา:

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

echo $xml;

นี้จะสะท้อนVV ทำไมและฉันจะสร้างสตริงหลายบรรทัดสำหรับสิ่งต่างๆเช่นSimpleXMLฯลฯ ได้อย่างไร


1
คุณต้องการให้สะท้อน "l" ตามด้วย "vv" ในบรรทัดถัดไปหรือไม่
Mike Samuel

3
concatenationแหงนมอง นั่นคือสิ่งที่เรียกว่าเมื่อคุณรวมสตริงเข้าด้วยกัน
Crashspeeder

14
@haywire ด้วยการเป็นผลลัพธ์แรกและเป็นประโยชน์บน Google
Cees Timmerman

คำตอบ:


282

ดี,

$xml = "l
vv";

ผลงาน

คุณยังสามารถใช้สิ่งต่อไปนี้:

$xml = "l\nvv";

หรือ

$xml = <<<XML
l
vv
XML;

แก้ไขตามความคิดเห็น:

คุณสามารถเชื่อมสตริงโดยใช้ตัว.=ดำเนินการ

$str = "Hello";
$str .= " World";
echo $str; //Will echo out "Hello World";

5
คุณลืมไปว่าฉันมีลูปหรือ MySQL ในขณะที่วนซ้ำระหว่าง ขอบคุณ
TheBlackBenzKid

96
@TheBlackBenzKid: อืมม ... อะไรนะ?
Madara's Ghost

1
ตัวอย่าง. ในขณะที่ ($ rc = mysql_fetch_array ($ adviews)) {$ xml. = "<set name = '". $ rc ["date"]. "' value = '1' hoverText = '". $ rc ["date" ]. "'/>"; } $ xml. = "</graph>";
TheBlackBenzKid

3
@Pacerier คุณไม่จำเป็นต้องหลีกหนีคำพูดใน heredoc
Madara's Ghost

7
@Pacerier คุณถามว่าทำไมเราต้องรบกวน heredoc มากกว่าคำพูด นั่นเป็นเหตุผลว่าทำไม ทั้งสองเป็นตัวเลือกสำหรับสตริงหลายบรรทัด
Madara's Ghost

154

PHP มีสตริง Heredoc และ Nowdoc ซึ่งเป็นวิธีที่ดีที่สุดในการจัดการสตริงหลายบรรทัดใน 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;

Nowdoc เป็นเหมือน Heredoc แต่ไม่ได้แทนที่ตัวแปร

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

ระวังว่าโทเค็นสิ้นสุดEODจะต้องไม่เยื้องเลยไม่เช่นนั้น PHP จะไม่รับทราบ นอกจากนี้คุณไม่จำเป็นต้องใช้ " EOD"; สามารถเป็นสตริงใดก็ได้ที่คุณต้องการ


11
โหวตขึ้นเพราะฉันมักจะลืมเกี่ยวกับการเยื้อง
Matuszek

11

ไม่แน่ใจว่ามันจะเพิ่มประสิทธิภาพอย่างไร แต่สำหรับที่ที่มันไม่สำคัญจริงๆฉันชอบรูปแบบนี้เพราะฉันมั่นใจได้ว่ามันใช้ \ r \ n (CRLF) ไม่ใช่รูปแบบใดก็ตามที่ไฟล์ PHP ของฉันเป็น บันทึกใน.

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

นอกจากนี้ยังช่วยให้ฉันเยื้องได้ตามต้องการ


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

จะสะท้อน:

l
vv

เอกสารเกี่ยวกับPHP_EOL


รายการโปรด @Pacerier
TheBlackBenzKid

มีวิธีทำเครื่องหมายคำตอบหรือไม่? ฉันคิดมาตลอดว่าคุณทำได้เฉพาะกับคำถามเท่านั้น @TheBlackBenzKid
Pacerier

ฉันหมายความว่าฉันให้เขาบวก +1 ในขณะที่ฉันเพิ่มเขา
TheBlackBenzKid

@TheBlackBenzKid "faved";)
Andrés Morales

5

อีกวิธีหนึ่งคือการใช้การบัฟเฟอร์เอาต์พุตคุณสามารถรวบรวมทุกสิ่งที่ถูกส่งออก / สะท้อนและเก็บไว้ในตัวแปร

<?php
ob_start(); 

?>line1
line2
line3<?php 

$xml = ob_get_clean();

โปรดทราบว่าการบัฟเฟอร์เอาต์พุตอาจไม่ใช่ทางออกที่ดีที่สุดในแง่ของประสิทธิภาพและความสะอาดของโค้ดสำหรับกรณีนี้ แต่ควรทิ้งไว้ที่นี่เพื่อใช้อ้างอิง


2

อาจจะลอง ". =" indead of "="?

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

จะให้ "lvv";


1
เขาบอกว่าเขาใช้ระบบปฏิบัติการแม่มดหรือไม่? Aanswer เป็นคำถามโดยสมบูรณ์;)
Norbert Orzechowicz

อย่างไรก็ตามไม่ได้ส่งผลให้เกิดสตริงหลายบรรทัดตามที่ร้องขอในคำถาม
ToolmakerSteve

1

ในการใส่สตริง "l" และ "vv" ในบรรทัดแยกกันในโค้ดเพียงอย่างเดียว:

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

ในกรณีนี้คุณกำลังบอกว่าจะต่อท้าย.=สตริงต่อท้ายเวอร์ชันก่อนหน้าของตัวแปรสตริงนั้น โปรดจำไว้ว่า = เป็นเพียงตัวดำเนินการกำหนดดังนั้นในรหัสเดิมของคุณคุณกำลังกำหนดตัวแปรเป็นค่าสตริงใหม่

ในการใส่สตริง "l" และ "vv" ในบรรทัดแยกกันในเสียงสะท้อนเพียงอย่างเดียว:

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

คุณไม่จำเป็นต้องมีหลายสตริงในกรณีนี้เนื่องจากอักขระของบรรทัดใหม่\nจะดูแลคุณเอง

ในการใส่สตริง "l" และ "vv" ในบรรทัดที่แยกจากกันในโค้ดและเมื่อสะท้อน:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.