下記のソースで既存の変数を配列で返すメソッドを利用し、var_dump()で返ってきたものを表示しております。
例えば$testだとstring(24) "ええええええええ"
のように表示されるのですが、文字列型のあとの(24)は、何を意味する数字ですか。
php
1$test = "ええええええええ"; 2$b = array(4,5,3,6,3); 3$hensu = get_defined_vars(); 4 5var_dump($hensu);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
バイト数です。UTF8 ではひらがなは一文字 3 バイトです。
投稿2016/07/12 11:36
総合スコア28673
0
ベストアンサー
【参考回答】
こちらをお読みください.
マルチバイト文字を扱う際に気をつけること
php
1$string = 'あいうえお'; 2 3$chars = []; 4foreach (preg_split('/(?<!\A)(?!\z)/u', $string) as $char) { 5 $chars[] = [ 6 'char' => $char, 7 'bytes(16進数)' => implode(' ', array_map('bin2hex', str_split($char))), 8 'bytes(10進数)' => implode(' ', array_map('ord', str_split($char))), 9 ]; 10} 11print_r($chars);
このようにしてみると,どの文字に何が割り当てられているのか一目でわかります.
投稿2016/07/12 15:00
編集2016/07/12 18:16総合スコア5223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
ご回答有難うございました。重ね重ね申し訳ありませんが、上記のソースは、
文字列あいうえおが代入された$stringと空っぽの配列が代入された$charsがある。
$stringを正規表現にかけ、何らかの方法でマッチしたらマッチした部分で分割する。分割したぶんだけforeach文で$charに代入し、
foreach文内で先ほど宣言していた空っぽの配列が代入されている$charsに、まず添え字がcharの値に$stringを正規表現で分割した$charを代入、
bytes(16進数)という添え字の値で、先ほどの分割したものが入った$charを配列にし(str_split)、配列内の値全てを16進数表記にして、
スペース区切りで文字列にする。
bytes(10進数)は、配列内全てをasciiにして、asciiになった配列を文字列に戻す。
という認識と、
上記の正規表現の、(何かしらの0文字から~1文字、小なり、感嘆符、文字列の始まり)(何かしらの0文字から1文字、感嘆符、文字列の終わり)で、これらを包んでいるカッコは、グループ化のためのもの、という認識は、合っておりますか。
文字列あいうえおが代入された$stringと,空の配列が代入された$charsがある.正規表現を使ってUTF-8文字列とみなして1文字ずつに分解し,$charに代入してループする.ループ内で
「UTF-8の1文字」
「UTF-8の1文字をstr_splitでバイトの配列に分解して,各要素をbin2hexで16進数表記文字列にし,更に半角スペースで結合したもの」
「UTF-8の1文字をstr_splitでバイトの配列に分解して,各要素をordで整数にし,更に半角スペースで結合したもの (自動的に整数型は10進数整数文字列に変換される)」
の3種類を作り,連想配列にまとめたものを$charsの要素として追加する.
…という動作です.正規表現に関しては,
何も書かなければ,任意のバイト境界に一致する
上記にu修飾子をつけると,任意のUTF-8文字境界に一致する
\Aは,先頭に一致する
\zは,終端に一致する
(?<!X)Yは,前にXが続かないYに一致する
X(?!Y)は,後ろにYが続かないXに一致する
(?<!\A)(?!\z)は,先頭と終端を覗いた任意のバイト境界に一致する
上記にu修飾子をつけると,先頭と終端を覗いた任意のUTF-8文字境界に一致する
…要するに,PHPにマルチバイト対応のstr_splitが存在していないので,preg_splitで無理やりやってるというわけです.
なお好みですが
preg_split('/(?<!\A)(?!\z)/u', $string)
は
preg_split('//u', $string, -1, PREG_SPILT_NO_EMPTY)
や
array_filter(preg_split('//u', $string), 'strlen')
でも構いません.個人的に一番上が最も短いのでしっくりきますが.

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/13 08:04
2016/07/13 08:07
2016/07/13 16:00 編集