PHP 日本會議 2024

str_pad

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

str_pad使用另一個字串將字串填充到特定長度

描述

str_pad(
    string $string,
    int $length,
    string $pad_string = " ",
    int $pad_type = STR_PAD_RIGHT
): string

此函數會傳回 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 筆記

110
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

?>
6
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 個字元長度的字串。
1
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),但您可以設定任何符合您需求的位數。
5
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,
12
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
"len $sl1: $s1 \n";
echo
"len $sl2: $s2 \n";
echo
"\n";
if (
$sl1 != $sl2) die("失敗!");
}
?>

輸出結果:
len 3: ...
len 3: ...

len 4: ...A
len 4: ...Ä

len 5: A...A
len 5: Ä...Ä

len 6: A...AO
len 6: Ä...ÄÖ
...
8
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;
}
?>
4
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";
?>
2
Spudley
17 年前
警告:如果你的字串包含非 ASCII 字元(例如英鎊符號),str_pad() 在計算填充時會將它們視為兩個字元。

例如
<?php
str_pad
($currency_symbol.$showtottopay,12," ",STR_PAD_LEFT);
?>
將根據 $currency_symbol 是英鎊還是美元而產生不同長度的字串。

希望這對某人有幫助 -- 在我解決這個問題之前,它導致我的發票中出現很多對齊錯誤的問題。
1
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);
}
0
Anonymous
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 是非多位元組字串時,仍然能正確工作
0
gene at swipesy dot com
13 年前
這是我如何使用 &nbsp; 填充的方式

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

對我的使用來說,似乎使用兩個 &nbsp; 標籤來新增每個字元效果很好。 YMMV。
1
pestilenc at hotmail dot com
22 年前
對我來說,這行得通。
$string = 'help';

#首先,使用 str_pad() 搭配獨特的字元。
$string = str_pad($string, 10, "*", STR_PAD_BOTH);
#$string = '***help***';

#其次,使用 str_replace 搭配 '&nbsp;'
$string = str_replace("*", "&nbsp;", $string);
0
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
-1
gtwizard
7 年前
sprintf 比較快

$sTime = microtime(true);
$s = sprintf("%'-1000000s", '-');
$eTime = microtime(true);
echo 'sprintf 執行時間為 ' . (($eTime - $sTime) * 1000) . ' 毫秒' . "\n";

$sTime = microtime(true);
$s = str_pad('-', 1000000, '-');
$eTime = microtime(true);
echo 'str_pad 執行時間為 ' . (($eTime - $sTime) * 1000) . ' 毫秒' . "\n";

//結果
sprintf 執行時間為 2.0260810852051 毫秒
str_pad 執行時間為 26.59797668457 毫秒
-3
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;
}
?>
-1
Anonymous
9 年前
對於簡單的填充,你可以使用 sprintf,它比較快
請看 https://php.dev.org.tw/sprintf 範例 #5「指定填充字元」
-2
Kirill Fuchs
7 年前
sprintf() 並非總是比較快... 它在擴展性上肯定比 str_pad 好得多,所以當執行一個填充 1 萬個字元的基準測試時,sprintf 會勝出。但是如果你測試一個更真實的場景,str_pad 看起來是明顯的贏家。

$sTime = microtime(true);
$count = 5;
$s = sprintf("%'\n5s", "\n");
$eTime = microtime(true);
echo 'sprintf 執行時間為 ' . (($eTime - $sTime) * 1000) . ' 毫秒' . "\n";

$sTime = microtime(true);
$s = str_pad("\n", 5, "\n");
$eTime = microtime(true);
echo 'str_pad 執行時間為 ' . (($eTime - $sTime) * 1000) . ' 毫秒' . "\n";

sprintf 執行時間為 0.015974044799805 毫秒
str_pad 執行時間為 0.0059604644775391 毫秒
-3
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 快。
-3
zubfatal <root at it dot dk>
19 年前
<?php
/**
* str_pad_html - 使用另一個字串將字串填充到特定長度。
* 在參數中接受 HTML 程式碼:$strPadString。
*
* @name str_pad_html()
* @author Tim Johannessen <root@it.dk>
* @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;
}
}

?>
-4
Kari &#34;Haprog&#34; 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);
}
?>
-5
private dot email at optusnet dot com dot au
19 年前
我寫了這 3 個函式,它們位於我每個程式都會包含的函式庫中。我覺得它們很有用,而且語法很簡單。

<?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---
?>

希望這對某些人有幫助!
-4
mreilly at NOSPAM dot mac dot com
22 年前
當使用字串作為填充值時,str_pad 會使用所有字元作為填充,並可能留下部分字串。(例如,如果填充值是 'ABC' 且需要填充 5 個字元,則輸出 'ABCAB'。)當您想要使用不斷行空格填充時,這會是個問題,因為不斷行空格的代碼長度為 6 個字元。

這個問題可以透過先用一個在字串中不會出現的單一字元 (例如 *) 填充字串,然後再使用 str_replace 將 * 替換為 &nbsp; 來解決。
-1
NOSPAM dot php at my dot jrklein dot com
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");
-4
babak dot asad73 at gmail dot com
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