2013-02-26 34 views
6

我試圖將現有數據從MySQL數據庫導出到ruby命令中,我可以使用rake db:seed運行。在PHP中使用sprintf時添加 n換行符號

這是我的代碼。

# Generate db:seed data for proveedores. 
$proveedores = R::findAll('tbproveedores'); 
$proveedoresE = R::exportAll($proveedores); 

foreach ($proveedoresE as &$p) { 

    $line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"\n'; 
    $exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website']); 
    var_dump($exportedLine); 
    fwrite($seeds, $exportedLine); 
    echo "<br />"; 
} 

注意$ line變量末尾的\n換行符號。我在網上閱讀,這是使用換行符所需的全部內容。

我的代碼的輸出上面(vertabim,長線):

BookSupplier.create(company: "Pearson", city: "Lima", country: "Peru", address: "Av. Limon", telephone: "4673535421", contact: "Javier", email: "", website: ""\nBookSupplier.create(company: "Project Management Institute - PMI", city: "Pennsylvania", country: "Estados Unidos", address: "Newtown Square, Pennsylvania", telephone: "1", contact: "Limberg Morales", email: "", website: "http://www.pmi.org/"\nBookSupplier.create(company: "UVirtual - Centro de Excelencia", city: "Santa Cruz", country: "Bolivia", address: "Av. Irala 585", telephone: "1", contact: "Limberg Morales", email: "", website: ""\nBookSupplier.create(company: "Ábaco de Rodolfo Depalma", city: "Buenos Aires", country: "Argentina", address: "Viamonte 1336, 4° (C1053 ACB) Buenos Aires", telephone: "5411-43711675", contact: "Limberg Morales", email: "", website: "http://www.abacoeditorial.com.ar/"\nBookSupplier.create(company: "Pablo Lledó - ProjectManagement", city: "Canadá", country: "Estados Unidos", address: "Victoria, BC, Canadá", telephone: "1", contact: "Limberg Morales", email: "", website: ""\n 

我想每個呼叫是在它自己的路線,下面我換行插入。任何建議我做錯了什麼?

回答

22

換行符號\n只會在封閉時解釋報價:"。這樣的:

$line = '...............'; 
$line .= "\n"; 

你也應該知道PHP_EOL它是一個包含系統換行分隔符是在幾個操作系統不同的常數。例如,它將在Linux上爲\n,而在Windows上爲\r\n。最輕便的代碼是這樣:

$line = '.....'; 
$line .= PHP_EOL; 
0
$line = "BookSupplier.create(company: '%s', city: '%s', country: '%s', address: '%s', telephone: '%s', contact: '%s', email: '%s', website: '%s'\n"; 

雙引號是強制性的\ -N(或任何其他whitescpace字符如\ t)的工作。

+1

您的字符串語法不正確(由於[so]的語法高亮顯示,它甚至是可見的)。您需要在字符串內部轉義雙引號*。 – Veger 2013-02-26 14:46:36

+1

很快..編輯它。我認爲他用引號標出了變量中的數據,所以將它們改爲單引號(轉義雙引號是另一種可能性)。 – 2013-02-26 14:51:23

2

在字符串中使用特殊字符,只有當它用雙引號(「)工作。見PHP string documentation以獲取更多信息。

因此,無論使用雙引號,這是很多的工作,你使用相當。字符串中的幾個雙引號,以及和逃避所有雙引號裏面的字符串

或者如果你是懶惰的,後來串聯新線:

$line = '...'; 
$line .= "\n"; 
5

您需要用雙引號中的字符串,單引用的人不會xpand特殊字符序列。查看the manual瞭解更多關於PHP字符串的細節。

+0

謝謝! – Jonathan 2015-05-01 11:16:46

11

如果你不能(或不願)切換到雙引號,您可以使用插入新行的ASCII碼,如下所示:

> php 
<?php printf('line one%cline two', 10);^D 
line one 
line two 
> 

%c讓你插入任何ASCII碼10是換行符的代碼。

1

從Josh的回答開始,您可以使用%s printf('something%s', "\n")將插入的字符串中的換行符插入到printf中,這在更復雜的示例中開始更有意義 - 例如,如果字符串模板存儲在語言變量中,或者您正在進行多個替換,或者只是因爲您的PHB要求而必須堅持使用sprintf。

你的情況,這將是

$line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"%s'; 
$exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website'], "\n"); 

我這樣格式的電子郵件標頭塊:

$headers = sprintf(
    'From: %1$s%2$sReply-To: %1$s%2$sMIME-Version: 1.0%2$sContent-type: text/html; charset=iso-8859-1%2$s' 
    , $EMAIL_FROM, "\r\n"); 

使用1$參數指標語法重複使用\r\n的。

所以%2$s成爲新的\r\n,不佔用任何額外的字符,但更難以閱讀!