Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用sprintf时添加\n换行符_Php_Newline_Printf - Fatal编程技术网

在PHP中使用sprintf时添加\n换行符

在PHP中使用sprintf时添加\n换行符,php,newline,printf,Php,Newline,Printf,我正在尝试将现有数据从MySQL数据库导出到ruby命令中,我可以使用rake db:seed运行这些命令 这是我的密码 # Generate db:seed data for proveedores. $proveedores = R::findAll('tbproveedores'); $proveedoresE = R::exportAll($proveedores); foreach ($proveedoresE as &$p) { $line = 'BookSupp

我正在尝试将现有数据从MySQL数据库导出到ruby命令中,我可以使用
rake db:seed
运行这些命令

这是我的密码

# 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 />";
}

我希望在插入新行后,每个通话都在自己的线路中。关于我做错了什么有什么建议吗?

只有当新行符号
\n
包含在双引号中时才会被解释:
。如下所示:

$line  = '...............';
$line .= "\n";
您还应该了解
PHP\u EOL
它是一个常量,包含系统换行分隔符,在几种操作系统上有所不同。例如,它在Linux上是
\n
,但在Windows上是
\r\n
。最可移植的代码如下所示:

$line  = '.....';
$line .= PHP_EOL;

双引号是\n(或任何其他类似于\t的whitecpace字符)必须使用的。

字符串中的特殊字符只有在包含在双引号(“)中时才有效。有关更多信息,请参阅

因此,要么使用双引号,这是一个很大的工作,因为您在字符串中使用了相当多的双引号。并转义字符串中的所有双引号

或者,如果您很懒,请在后面连接新行:

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

您需要使用双引号字符串,单引号字符串不会扩展特殊字符序列。查看PHP字符串的更多详细信息。

如果不能(或不想)切换到双引号,可以使用ASCII代码插入换行符,如下所示:

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

根据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
,不占用任何额外字符,但更难阅读

您的字符串语法不正确(由于的语法突出显示,它甚至可见)。您需要对字符串中的双引号进行转义。是否要快速。。编辑它。我猜想他使用引号只是为了标记变量中的数据,所以将它们改为单引号(另一种可能是转义双引号)。虽然是一个神奇的数字(有点),但我更喜欢这种解决方案
$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");