[PHP] あまり使わなさそうな文字列関数さんたち

 

implode()

PHP: implode - Manual

$a = array(1,2,3,4,5);
var_dump(implode($a));
var_dump(implode('-', $a));
// 非推奨だけど引数を入れ替えても同じ結果になる
var_dump(implode($a, '-'));

結果

string '12345' (length=5)
string '1-2-3-4-5' (length=9)
string '1-2-3-4-5' (length=9)

explodeの逆。JavaScriptのArray.Join()に当たる、というよりphpのjoin()はimplode()のエイリアス

mb_strrpos()

PHP: mb_strrpos - Manual

<?php
var_dump(mb_strrpos('aaa', 'a', 0, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', 1, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', 2, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', 3, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', 4, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', -1, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', -2, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', -3, 'UTF-8'));
var_dump(mb_strrpos('aaa', 'a', -4, 'UTF-8'));

結果

int 2
int 2
int 2
boolean false
( ! ) Warning: mb_strrpos() [function.mb-strrpos]: Offset is greater than the length of haystack string in *** on line 6
boolean false
int 2
int 1
int 0
( ! ) Warning: mb_strrpos() [function.mb-strrpos]: Offset is greater than the length of haystack string in *** on line 10
boolean false
<?php
var_dump(mb_strrpos('-a--', 'a', 0, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', 1, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', 2, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', 3, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', 4, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', -1, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', -2, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', -3, 'UTF-8'));
var_dump(mb_strrpos('-a--', 'a', -4, 'UTF-8'));

結果

int 1
int 1
boolean false
boolean false
boolean false
int 1
int 1
int 1
boolean false

str_shuffle()

PHP: str_shuffle - Manual

var_dump(str_shuffle('foobar2000'));

結果

string 'o0of02a0br' (length=10)

引数は一つのみ。マルチバイト文字が混ざると非対応につき酷いことになる

str_ireplace()

PHP: str_ireplace - Manual

var_dump(
  str_ireplace(
    array('AAA', 'AA', 'A'),
    array('3', '2', '1'),
    array('aaaaa', 'a-aa-aaa')
  )
);

結果

array
  0 => string '32' (length=2)
  1 => string '1-2-3' (length=5)

strtr()

PHP: strtr - Manual

<?php
var_dump(strtr('123456', '123', 'abcdef'));
var_dump(strtr('123456', '123456', 'abc'));

結果

string 'abc456' (length=6)
string 'abc456' (length=6)

なんとも癖のある文字列置換関数

<?php
function bm(){
  static $measured_time = 0;
  $t = microtime(TRUE);
  if($measured_time !== 0)
    echo round($t - $measured_time, 6),"\n";
  $measured_time = $t;
}
bm();

$s = '';
for($i = 0; $i < 3000; $i++){
  $s = strtr('hogehoge', 'hoge', 'gafu');
}
echo $s, "\n";
bm();

$s = '';
for($i = 0; $i < 3000; $i++){
  $s = str_replace('hoge', 'gafu', 'hogehoge');
}
echo $s, "\n";
bm();

結果

gafugafu
0.024165
gafugafu
0.015363

strtr の方が速そうだと思ってたら、str_replace の方が速かった…

mb_strstr()

PHP: mb_strstr - Manual。大文字小文字を区別しないmb_stristrもある。

<php
$haystack = '0123456789';
$needle = '456';
var_dump(
  mb_strstr($haystack, $needle, true, 'UTF-8')
);
var_dump(
  mb_strstr($haystack, $needle, false, 'UTF-8')  
);

結果

string '0123' (length=4)
string '456789' (length=6)

mb_strpos() と違って文字列を返す。どの部分を返すかを第3引数で指定。PHP: mb_strrichr - Manualなども参照

strcmp()

PHP: strcmp - Manual

<?php
var_dump(
  strcmp("c", "b")
);
var_dump(
  strcmp("c", "d")
);
var_dump(
  strcmp("c", "c")
);
var_dump(
  strcmp("c", "C")
);

結果

int 1
int -1
int 0
int 1

大文字小文字を区別しないときは strcasecmp() を使用する。strncmp(), strncasecmp(), strnatcmp()など同系の文字列比較関数がいろいろある。

strpbrk()

PHP: strpbrk - Manual

<?php
$text = "aaaAAAbbbBBBcccCCC\n";
echo strpbrk($text, 'Ccb');
echo strpbrk($text, 'BBBBBBBBBBB');

結果

bbbBBBcccCCC
BBBcccCCC

strrev()

<?php
echo strrev("abc\ndef")

結果

fed
cba

マルチバイトには当然使えず。

strtok()

PHP: strtok - Manual

<?php
echo strtok("This is a pen!", " ");
echo "\n----\n";
echo strtok(" ");
echo "\n----\n";
echo strtok("e");

結果

This
----
is
----
a p

mb_substr_count()

<?php
$str = "I love Fernweh and 8000, so my handlename is Fernweh8000";
var_dump(
  mb_substr_count($str, 'Fernweh', 'UTF-8')
);
var_dump(
  mb_substr_count($str, 'Foobar', 'UTF-8')
);

結果

int 2
int 0

ucfirst(), ucwords()

PHP: ucfirst - Manual

PHP: ucwords - Manual

<?php
$string = "i am fernweh";
var_dump(
  ucfirst( $string )
);
var_dump(
  ucwords( $string )
);

結果

string 'I am fernweh' (length=12)
string 'I Am Fernweh' (length=12)

lcfirst() という関数は ucfirst() とは逆を行う。

chunk_split

PHP: chunk_split - Manual

<?php
echo chunk_split('ABCDEFG', '3', "[/END]\r\n");

結果

ABC[/END]
DEF[/END]
G[/END]

strspn()

PHP: strspn - Manual

<?php
var_dump(
  strspn("777-A-123456789", "0123456789")
);
var_dump(
  strspn("777-A-123456789", "0123456789", 5)
);
var_dump(
  strspn("777-A-123456789", "0123456789", 6)
);
var_dump(
  strspn("777-A-123456789", "0123456789", 6, 3)
);

結果

int 3
int 0
int 9
int 3

str-repeat()

PHP: str_repeat - Manual

<?php
echo str_repeat("■□", 5);

結果

■□■□■□■□■□

str_split()

PHP: str_split - Manual

<?php
var_dump(
  str_split("abc")
);
var_dump(
  str_split("0123456789", 3)
);

結果

array
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => string 'c' (length=1)
array
  0 => string '012' (length=3)
  1 => string '345' (length=3)
  2 => string '678' (length=3)
  3 => string '9' (length=1)

str_pad()

PHP: str_pad - Manual

<?php
$arr = array(1,2,3,10,11,999);
foreach($arr as $v){
  echo str_pad($v, 3, "-", STR_PAD_LEFT), " | *****\n";
}

結果

--1 | *****
--2 | *****
--3 | *****
-10 | *****
-11 | *****
999 | *****

str_rot13()

PHP: str_rot13 - Manual

ROT13ってなんだよって思ったらとっても簡単な代物だったROT13 - Wikipedia

<?php
var_dump(
  str_rot13('BCDEFopqrs+-=')
);

結果

string 'OPQRSbcdef+-=' (length=13)
Share
関連記事