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
?>str_pad
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
str_pad
Референца за `function.str-pad.php` со подобрена типографија и навигација.
str_pad
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
str_pad — Пополни низа до одредена должина со друга низа
= NULL
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() example
<?php
$input = "Alien";
echo str_pad($input, 10), PHP_EOL; // produces "Alien "
echo str_pad($input, 10, "-=", STR_PAD_LEFT), PHP_EOL; // produces "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH), PHP_EOL; // produces "__Alien___"
echo str_pad($input, 6, "___"), PHP_EOL; // produces "Alien_"
echo str_pad($input, 3, "*"), PHP_EOL; // produces "Alien"
?>Види Исто така
- mb_str_pad() - Пополни низа со повеќе бајти до одредена должина со друга низа со повеќе бајти
Белешки од корисници Управување со PDO конекции
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.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.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: Ä...ÄÖ
...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,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;
}
?>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";
?>