PHPのお勉強!

PHP TOP

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_RIGHT, STR_PAD_LEFT, STR_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() - マルチバイト文字列を、特定の長さまで別のマルチバイト文字列で埋める

add a note

User Contributed Notes 23 notes

up
110
Marjune
10 years ago
since the default pad_type is STR_PAD_RIGHT. using STR_PAD_BOTH were always favor in the right pad if the required number of padding characters can't be evenly divided.

e.g

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

?>
up
5
Borszczuk
2 years ago
Beware, \str_pad() is NOT able to correctly handle multibyte characters and as \strlen() it is assuming one char == byte. If you have multibyte chars in your string your result string will be shorter than you expect:

<?php
$a
= 'áč'; // 2 accented chars
$lenA = \mb_strlen($a);
echo
$lenA . PHP_EOL;

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

would produce:

2
10

instead of expected 12. There seem noth to be mb_str_pad() equivalent so you may end you concatenating your string and padding manually:

<?php
$a
= 'áč'; // 2 accented chars

$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);
}
?>

returns expected 12 char long string.
up
1
neo_selen
4 years ago
you can use str_pad to display an integer with a fixed amount of digits, like that:
0002
0003
...
0100

by just writing

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

i set 4 digits (see parameter #2), but you can set any fitting your needs.
up
4
robertwhishaw at gmail dot com
4 years ago
Incrementing or decrementing numbers in PHP is easy with the ++ and -- operators but it can be difficult to set the precision of the numbers. The str_pad() can be useful for concatenating a string to the beginning or end of the incrementing number to simulate a different precision.

Good example, we want to increment 001 to 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',

Bad example, we want to increment 001 to 002, 003, 004 but if we set $i = 001 in the for() loop to start with, 001 will be converted to 1 and the incrementing will return: 1, 2, 3, 4 etc...

$numbers = [];

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

print_r($numbers);

$numbers[0] => 1,
$numbers[1] => 2,
$numbers[2] => 3,
$numbers[3] => 4,
up
11
qeremy [atta] gmail [dotta] com
11 years ago
A proper unicode string padder;

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

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; // @debug
}
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;
}
?>

Test;
<?php
// needs ie. "test.php" file encoded in "utf-8 without bom"
$s = '...';
for (
$i = 3; $i <= 1000; $i++) {
$s1 = str_pad($s, $i, 'AO', STR_PAD_BOTH); // can not inculde unicode char!!!
$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("Fail!");
}
?>

Output;
len 3: ...
len 3: ...

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

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

len 6: A...AO
len 6: Ä...ÄÖ
...
up
7
wes at nospamplsexample dot org
10 years ago
multibyte version:

<?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)); // safe if used with valid utf-8 strings
$before = $padBefore ? mb_substr($repeatedString, 0, floor($targetLen), $encoding) : '';
$after = $padAfter ? mb_substr($repeatedString, 0, ceil($targetLen), $encoding) : '';
return
$before . $str . $after;
}
?>
up
3
bob [at] bobarmadillo [dot] com
22 years ago
In a lot of cases you're better off using str_repeat if you want to use something like - it repeats the entire string.

Using str_repeat, I wrote a full string pad function that should closely mimic str_pad in every other way:

<?php
function full_str_pad($input, $pad_length, $pad_string = '', $pad_type = 0) {
$str = '';
$length = $pad_length - strlen($input);
if (
$length > 0) { // str_repeat doesn't like negatives
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 {
// defaults to STR_PAD_LEFT == 0
$str = str_repeat($pad_string, $length).$input;
}
} else {
// if $length is negative or zero we don't need to do anything
$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";
?>
up
1
Spudley
17 years ago
Warning: If your string includes non-ascii characters (eg the British pounds sign), str_pad() will treat these as two characters when calculating the padding.

So for example:
<?php
str_pad
($currency_symbol.$showtottopay,12," ",STR_PAD_LEFT);
?>
will produce a different length string depending on whether $currency_symbol is pounds or dollars.

Hope this helps someone -- it caused me a lot of problems with misaligned columns in my invoices until I worked it out.
up
0
mcinp
9 years ago
a different, more robust multibyte version of str_pad that works correctly only if $pad_string is non-multibyte 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);
}
up
0
pestilenc at hotmail dot com
22 years ago
For me this worked.
$string = 'help';

#First, str_pad() with unique character.
$string = str_pad($string, 10, "*", STR_PAD_BOTH);
#$string = '***help***';

#Second, str_replace with '&nbsp;'
$string = str_replace("*", "&nbsp;", $string);
up
-1
Anonymous
8 years ago
Here is the mcinp's version of mb_str_pad bugfixed:

<?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);
}
?>

Still working correctly only if $pad_string is non-multibyte string
up
-1
gene at swipesy dot com
13 years ago
This is how I pad using &nbsp; :

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

Seems to work well using two &nbsp; tags for each character added, at least for my use. YMMV.
up
-1
Fahad dot Gilani at anu dot edu dot au
22 years ago
Basically, *all* of you guys have a 'long' way of padding text with html tags (which includes &nbsp;) You dont even have to do a str_replace... try the following code and this will work with ANY html tag there is out there and you don't have to worry about tag character lengths so on and so forth:
<?
$text = "This is pretty interesting!";
$pad_string = "&nbsp;";

//Pad text on both sides
$text = str_pad($text, strlen($text)+(20*strlen($pad_string)), $pad_string, STR_PAD_BOTH);
print $text." Dont you think?";
?>
Will produce:
This is pretty interesting! Dont you think?

Cheers,
Fahad
up
-4
bxi at apparoat dot nl
16 years ago
In case you want to pad 2 strings together with a character you can use:

<?php
function pad_between_strings($string1, $string2, $length, $char = " ") {
$fill_length = $length - ( strlen($string1) + strlen($string2) );
return
$string1 . str_repeat($char, $fill_length) . $string2;
}
?>
up
-2
gtwizard
7 years ago
sprintf is faster

$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";

//result
sprintf ran in 2.0260810852051 milliseconds
str_pad ran in 26.59797668457 milliseconds
up
-3
Kirill Fuchs
7 years ago
sprintf() is not always faster... It certainly scales a lot better then str_pad so when running a benchmark that pads 10k characters, sprintf will come out on top. But if you benchmarked a more real world scenario, it seems str_pad comes out the clear winner.

$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
up
-4
christian dot reinecke at web dot de
17 years ago
Fills the first argument (mostly a number, f.e. from a <select> loop to display a date or time) with zeroes.

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

sprintf() is indeed faster than str_pad.
up
-2
Anonymous
9 years ago
For simple padding, you can use sprintf, which is faster:
see http://php.net/sprintf Example #5 "Specifying padding character"
up
-5