PHP Conference Japan 2024

str_pad

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

str_pad使用另一个字符串将字符串填充到特定长度

描述

str_pad(
    字符串 $string,
    整数 $length,
    字符串 $pad_string = " ",
    整数 $pad_type = STR_PAD_RIGHT
): 字符串

此函数返回在左侧、右侧或两侧填充到指定填充长度的string字符串。如果省略可选参数pad_string,则string将用空格填充,否则将使用pad_string中的字符填充到限制为止。

参数

string

输入字符串。

length

最终填充字符串的所需长度。length的值如果为负数、小于或等于输入字符串的长度,则不进行填充,将返回string

pad_string

注意:

如果所需的填充字符数不能被pad_string的长度整除,则pad_string可能会被截断。

pad_type

可选参数pad_type可以是STR_PAD_RIGHTSTR_PAD_LEFTSTR_PAD_BOTH。如果未指定pad_type,则假定为STR_PAD_RIGHT

返回值

返回填充后的字符串。

范例

示例 #1 str_pad() 例子

<?php
$input
= "Alien";
echo
str_pad($input, 10); // 输出 "Alien "
echo str_pad($input, 10, "-=", STR_PAD_LEFT); // 输出 "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH); // 输出 "__Alien___"
echo str_pad($input, 6, "___"); // 输出 "Alien_"
echo str_pad($input, 3, "*"); // 输出 "Alien"
?>

参见

  • mb_str_pad() - 使用另一个多字节字符串将多字节字符串填充到特定长度

添加注释

用户贡献的注释 24 条注释

Marjune
10 年前
由于默认的 pad_type 是 STR_PAD_RIGHT,因此如果所需的填充字符数不能被整除,则始终倾向于使用 STR_PAD_BOTH 进行右侧填充。

例如

<?php

echo str_pad("input", 10, "pp", STR_PAD_BOTH ); // ppinputppp
echo str_pad("input", 6, "p", STR_PAD_BOTH ); // inputp
echo str_pad("input", 8, "p", STR_PAD_BOTH ); //pinputpp

?>
Borszczuk
2 年前
注意,\str_pad() 无法正确处理多字节字符,因为它与 \strlen() 一样,假设一个字符 == 一个字节。如果你的字符串中有多字节字符,你的结果字符串将比你预期的短。

<?php
$a
= 'áč'; // 2 个带重音的字符
$lenA = \mb_strlen($a);
echo
$lenA . PHP_EOL;

$b = \str_pad($a, $lenA + 10, ' ');
$lenB = \mb_strlen($b);
echo
$lenB . PHP_EOL;
?>

将输出

2
10

而不是预期的 12。似乎没有 mb_str_pad() 等效项,因此你可能最终需要手动连接你的字符串并进行填充。

<?php
$a
= 'áč'; // 2 个带重音字符

$b = mb_str_pad($a, $lenA + 10, ' ');
$lenB = \mb_strlen($b);
echo
$lenB . PHP_EOL;

function
mb_str_pad(string $str, int $len, string $pad, int $align = \STR_PAD_RIGHT): string
{
$strLen = \mb_strlen($str);
if (
$strLen >= $len) {
return
$str;
}

$diff = $len - $strLen;
$padding = \mb_substr(\str_repeat($pad, $diff), 0, $diff);

switch (
$align) {
case
\STR_PAD_BOTH:
$diffHalf = (int)($diff/2 + 0.5);
$padding = \str_repeat($pad, $diffHalf);
$result = "{$padding}{$str}{$padding}";
break;
case
\STR_PAD_LEFT:
$result = "{$padding}{$str}";
$result = "{$str}{$padding}";
break;
case
\STR_PAD_RIGHT:
default:
$result = "{$str}{$padding}";
break;
}

return
\mb_substr($result, 0, $len);
}
?>

返回预期长度为 12 个字符的字符串。
neo_selen
4 年前
您可以使用 str_pad 来显示具有固定位数的整数,例如
0002
0003
...
0100

只需编写

<?php
for ($i=0;$i<10000;$i++){
echo
str_pad($i,4,'0',STR_PAD_LEFT)."\n";
}
?>

我设置了 4 位数字(参见参数 #2),但您可以根据需要设置任何位数。
robertwhishaw at gmail dot com
4 年前
在 PHP 中递增或递减数字使用 ++ 和 -- 运算符很容易,但设置数字的精度可能很困难。str_pad() 可用于将字符串连接到递增数字的开头或结尾,以模拟不同的精度。

一个好例子,我们想将 001 递增到 002、003、004

$numbers = [];

for($i = 1; $i <= 4; $i++){
$numbers[] = str_pad($i, 3, '0', STR_PAD_LEFT);
}

print_r($numbers);

$numbers[0] => '001',
$numbers[1] => '002',
$numbers[2] => '003',
$numbers[3] => '004',

一个坏例子,我们想将 001 递增到 002、003、004,但如果我们在 for() 循环中将 $i 设置为 001 开始,001 将转换为 1,递增将返回:1、2、3、4 等……

$numbers = [];

for($i = 001; $i <= 4; $i++){
$numbers[] = $i;
}

print_r($numbers);

$numbers[0] => 1,
$numbers[1] => 2,
$numbers[2] => 3,
$numbers[3] => 4,
qeremy [atta] gmail [dotta] com
11 年前
一个合适的 Unicode 字符串填充器:

<?php
mb_internal_encoding
('utf-8'); // @重要

function str_pad_unicode($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT) {
$str_len = mb_strlen($str);
$pad_str_len = mb_strlen($pad_str);
if (!
$str_len && ($dir == STR_PAD_RIGHT || $dir == STR_PAD_LEFT)) {
$str_len = 1; // @调试
}
if (!
$pad_len || !$pad_str_len || $pad_len <= $str_len) {
return
$str;
}

$result = null;
$repeat = ceil($str_len - $pad_str_len + $pad_len);
if (
$dir == STR_PAD_RIGHT) {
$result = $str . str_repeat($pad_str, $repeat);
$result = mb_substr($result, 0, $pad_len);
} else if (
$dir == STR_PAD_LEFT) {
$result = str_repeat($pad_str, $repeat) . $str;
$result = mb_substr($result, -$pad_len);
} else if (
$dir == STR_PAD_BOTH) {
$length = ($pad_len - $str_len) / 2;
$repeat = ceil($length / $pad_str_len);
$result = mb_substr(str_repeat($pad_str, $repeat), 0, floor($length))
.
$str
. mb_substr(str_repeat($pad_str, $repeat), 0, ceil($length));
}

return
$result;
}
?>

测试:
<?php
// 需要 "test.php" 文件使用 "utf-8 without bom" 编码
$s = '...';
for (
$i = 3; $i <= 1000; $i++) {
$s1 = str_pad($s, $i, 'AO', STR_PAD_BOTH); // 不能包含 Unicode 字符!!!
$s2 = str_pad_unicode($s, $i, 'ÄÖ', STR_PAD_BOTH);
$sl1 = strlen($s1);
$sl2 = mb_strlen($s2);
echo
"长度 $sl1: $s1 \n";
echo
"长度 $sl2: $s2 \n";
echo
"\n";
if (
$sl1 != $sl2) die("失败!");
}
?>

输出:
长度 3: ...
长度 3: ...

长度 4: ...A
长度 4: ...Ä

长度 5: A...A
长度 5: Ä...Ä

长度 6: A...AO
长度 6: Ä...ÄÖ
...
wes at nospamplsexample dot org
10 年前
多字节版本

<?php
function mb_str_pad($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT, $encoding = NULL)
{
$encoding = $encoding === NULL ? mb_internal_encoding() : $encoding;
$padBefore = $dir === STR_PAD_BOTH || $dir === STR_PAD_LEFT;
$padAfter = $dir === STR_PAD_BOTH || $dir === STR_PAD_RIGHT;
$pad_len -= mb_strlen($str, $encoding);
$targetLen = $padBefore && $padAfter ? $pad_len / 2 : $pad_len;
$strToRepeatLen = mb_strlen($pad_str, $encoding);
$repeatTimes = ceil($targetLen / $strToRepeatLen);
$repeatedString = str_repeat($pad_str, max(0, $repeatTimes)); // 如果使用有效的 utf-8 字符串则安全
$before = $padBefore ? mb_substr($repeatedString, 0, floor($targetLen), $encoding) : '';
$after = $padAfter ? mb_substr($repeatedString, 0, ceil($targetLen), $encoding) : '';
return
$before . $str . $after;
}
?>
bob [at] bobarmadillo [dot] com
22 年前
在很多情况下,如果你想使用类似的功能,最好使用 `str_repeat`,因为它会重复整个字符串。

使用 `str_repeat`,我编写了一个完整的字符串填充函数,它应该在其他方面与 `str_pad` 非常相似。

<?php
function full_str_pad($input, $pad_length, $pad_string = '', $pad_type = 0) {
$str = '';
$length = $pad_length - strlen($input);
if (
$length > 0) { // str_repeat 不喜欢负数
if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1
$str = $input.str_repeat($pad_string, $length);
} elseif (
$pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2
$str = str_repeat($pad_string, floor($length/2));
$str .= $input;
$str .= str_repeat($pad_string, ceil($length/2));
} else {
// 默认值为 STR_PAD_LEFT == 0
$str = str_repeat($pad_string, $length).$input;
}
} else {
// 如果 $length 为负数或零,我们不需要做任何事情
$str = $input;
}
return
$str;
}

$pad_me = "Test String";
echo
'|'.full_str_pad($pad_me, 20, ' ')."|\n";
echo
'|'.full_str_pad($pad_me, 20, ' ', STR_PAD_RIGHT)."|\n";
echo
'|'.full_str_pad($pad_me, 20, ' ', STR_PAD_BOTH)."|\n";
?>
Spudley
17 年前
警告:如果你的字符串包含非 ASCII 字符(例如英镑符号),`str_pad()` 在计算填充时会将它们视为两个字符。

例如
<?php
str_pad
($currency_symbol.$showtottopay,12," ",STR_PAD_LEFT);
?>
生成的字符串长度将取决于 `$currency_symbol` 是英镑还是美元。

希望这对某些人有所帮助——在我解决这个问题之前,它在我的发票中造成了很多列对齐问题。
mcinp
9 年前
`str_pad` 的一个不同的、更健壮的多字节版本,只有在 `$pad_string` 是非多字节字符串时才能正确工作。

function my_mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT,$encoding='UTF-8'){
$mb_diff=mb_strlen($str, $encoding)-strlen($string);
return str_pad($input,$pad_length+$mb_diff,$pad_string,$pad_type);
}
匿名用户
8 年前
这是 mcinp 版本的 `mb_str_pad` 的错误修正版。

<?php
function mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT,$encoding='UTF-8'){
$mb_diff=mb_strlen($input, $encoding)-strlen($input);
return
str_pad($input,$pad_length-$mb_diff,$pad_string,$pad_type);
}
?>

仍然只有在 `$pad_string` 是非多字节字符串时才能正确工作。
gene at swipesy dot com
13年前
我用&nbsp;来填充字符串的方法如下:

str_replace(" ", "&nbsp;&nbsp;", str_pad($foo, 10, " ", STR_PAD_LEFT))

对于我的用途来说,每个添加的字符使用两个&nbsp;标签似乎效果很好。你的结果可能会有所不同。(YMMV)
pestilenc at hotmail dot com
22 年前
对我来说,这个方法有效。
$string = 'help';

#首先,使用唯一字符进行str_pad()填充。
$string = str_pad($string, 10, "*", STR_PAD_BOTH);
#$string = '***help***';

#其次,使用'&nbsp;'进行str_replace替换。
$string = str_replace("*", "&nbsp;", $string);
Fahad dot Gilani at anu dot edu dot au
22 年前
基本上,你们所有人都在用HTML标签(包括&nbsp;)以一种“冗长”的方式填充文本。你甚至不需要执行str_replace...尝试以下代码,它适用于任何HTML标签,你无需担心标签字符长度等等。
<?
$text = "This is pretty interesting!";
$pad_string = "&nbsp;";

//在两侧填充文本
$text = str_pad($text, strlen($text)+(20*strlen($pad_string)), $pad_string, STR_PAD_BOTH);
print $text." Dont you think?";
?>
将输出
This is pretty interesting! Dont you think?

致敬,
Fahad
gtwizard
7年前
sprintf速度更快

$sTime = microtime(true);
$s = sprintf("%'-1000000s", '-');
$eTime = microtime(true);
echo 'sprintf ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

$sTime = microtime(true);
$s = str_pad('-', 1000000, '-');
$eTime = microtime(true);
echo 'str_pad ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

//结果
sprintf ran in 2.0260810852051 milliseconds
str_pad ran in 26.59797668457 milliseconds
bxi at apparoat dot nl
16年前
如果你想用一个字符将两个字符串填充在一起,可以使用

<?php
function pad_between_strings($string1, $string2, $length, $char = " ") {
$fill_length = $length - ( strlen($string1) + strlen($string2) );
return
$string1 . str_repeat($char, $fill_length) . $string2;
}
?>
匿名用户
9 年前
对于简单的填充,可以使用sprintf,它更快
参见 https://php.net/sprintf 例子 #5 "指定填充字符"
Kirill Fuchs
7年前
sprintf()并不总是更快...它的扩展性比str_pad好得多,所以在填充10k个字符的基准测试中,sprintf会胜出。但是,如果你对更真实的场景进行基准测试,str_pad似乎是明显的赢家。

$sTime = microtime(true);
$count = 5;
$s = sprintf("%'\n5s", "\n");
$eTime = microtime(true);
echo 'sprintf ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

$sTime = microtime(true);
$s = str_pad("\n", 5, "\n");
$eTime = microtime(true);
echo 'str_pad ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

sprintf ran in 0.015974044799805 milliseconds
str_pad ran in 0.0059604644775391 milliseconds
christian dot reinecke at web dot de
17 年前
用零填充第一个参数(大多数情况下是一个数字,例如来自<select>循环的日期或时间显示)。

<?php
function zerofill($mStretch, $iLength = 2)
{
$sPrintfString = '%0' . (int)$iLength . 's';
return
sprintf($sPrintfString, $mStretch);
}
?>

sprintf()确实比str_pad快。
zubfatal <root at it dot dk>
19年前
<?php
/**
* str_pad_html - 使用另一个字符串将字符串填充到特定长度。
* 接受参数$strPadString中的HTML代码。
*
* @name str_pad_html()
* @author Tim Johannessen <[email protected]>
* @version 1.0.0
* @param string $strInput 要迭代的数组,所有非数值值都将被跳过。
* @param int $intPadLength 填充长度,必须大于零。
* @param string [$strPadString] 用于填充$strInput的字符串(默认值:&nbsp;)
* @param int [$intPadType] STR_PAD_LEFT, STR_PAD_RIGHT (默认值), STR_PAD_BOTH
* @return string 返回填充后的字符串
**/
function str_pad_html($strInput = "", $intPadLength, $strPadString = "&nbsp;", $intPadType = STR_PAD_RIGHT) {
if (
strlen(trim(strip_tags($strInput))) < intval($intPadLength)) {

switch (
$intPadType) {
// STR_PAD_LEFT
case 0:
$offsetLeft = intval($intPadLength - strlen(trim(strip_tags($strInput))));
$offsetRight = 0;
break;

// STR_PAD_RIGHT
case 1:
$offsetLeft = 0;
$offsetRight = intval($intPadLength - strlen(trim(strip_tags($strInput))));
break;

// STR_PAD_BOTH
case 2:
$offsetLeft = intval(($intPadLength - strlen(trim(strip_tags($strInput)))) / 2);
$offsetRight = round(($intPadLength - strlen(trim(strip_tags($strInput)))) / 2, 0);
break;

// STR_PAD_RIGHT
default:
$offsetLeft = 0;
$offsetRight = intval($intPadLength - strlen(trim(strip_tags($strInput))));
break;
}

$strPadded = str_repeat($strPadString, $offsetLeft) . $strInput . str_repeat($strPadString, $offsetRight);
unset(
$strInput, $offsetLeft, $offsetRight);

return
$strPadded;
}

else {
return
$strInput;
}
}

?>
Kari “Haprog” Sderholm
15年前
这是一个快速简便的方法,可以创建一个mb_str_pad函数,在正确设置内部编码时可以使用。

我不确定这在所有可能的情况下都能很好地工作,但至少在我使用UTF-8作为内部编码,并使用此函数处理包含斯堪的纳维亚字符“åäöÅÄÖ”(在UTF-8中为双字节)的字符串时,它确实有效。

<?php
function mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT) {
$diff = strlen($input) - mb_strlen($input);
return
str_pad($input, $pad_length+$diff, $pad_string, $pad_type);
}
?>
private dot email at optusnet dot com dot au
19年前
我编写了这三个函数,它们存在于我每个程序中都包含的库中。我发现它们很有用,而且语法也很简单。

<?php

$str
= "test";

function
str_pad_right ( $string , $padchar , $int ) {
$i = strlen ( $string ) + $int;
$str = str_pad ( $string , $i , $padchar , STR_PAD_RIGHT );
return
$str;
}

function
str_pad_left ( $string , $padchar , $int ) {
$i = strlen ( $string ) + $int;
$str = str_pad ( $string , $i , $padchar , STR_PAD_LEFT );
return
$str;
}

function
str_pad_both ( $string , $padchar , $int ) {
$i = strlen ( $string ) + ( $int * 2 );
$str = str_pad ( $string , $i , $padchar , STR_PAD_BOTH );
return
$str;
}

echo
str_pad_left ( $str , "-" , 3 ); // 输出:---test
echo str_pad_right ( $str , "-" , 3 ); // 输出:test---
echo str_pad_both ( $str , "-" , 3 ); // 输出:---test---
?>

希望这个能帮到其他人!
[email protected]
22 年前
当使用字符字符串作为填充值时,`str_pad` 使用所有字符进行填充,并可能留下部分字符串。(例如,如果填充值为 'ABC' 并且需要填充 5 个字符,则输出 'ABCAB'。) 当你想要使用不换行空格进行填充时,这是一个问题,其代码长度为 6 个字符。

可以通过首先使用字符串中找不到的单个字符(例如 *)填充字符串,然后用 &nbsp; 替换 * 来解决这个问题。
[email protected]
4 年前
当使用分组密码和 `openssl_encrypt()` 及类似函数进行手动填充时,`str_pad()` 可以提供足够的“零填充”。

下面的例子将用两个 \x00 字符填充 6 个字符的文本“Secret”,并返回 8 个字符的数据。根据需要替换你的纯文本和块大小。

<?php
$text
= "Secret";
$block_size = 8;
$length = ceil(strlen($text) / $block_size) * $block_size;
$data = str_pad($text, $length, "\x00");
[email protected]
4 年前
如何在数字前面添加一些 0
例如 5 ==> 005

像这样操作

echo str_pad(5,3,0,STR_PAD_LEFT); // 结果 005

echo str_pad(4,6,0,STR_PAD_LEFT); // 结果 000005
To Top