プロが教えるわが家の防犯対策術!

多次元配列でも文字コードのエンコードができる関数を
作ろうとしていますが、エラーで躓いています。

自分自身の関数を再帰で呼び出しているので、array_map関数上?
引数が1つしか持てないので、$valueを array($ary, "SJIS", "EUC-JP")として渡しています。

これを実行すると、以下のエラーになります。
何かよい方法はありますか?

PHP Notice: Undefined offset: 0 in C:\test.php on line 10

function mb_convert_encoding_deep($value)
{
//var_dump($value);
if( is_array($value) ){
if( is_array($value[0]) ){
array_map(__FUNCTION__, $value);
}else{
$value[0] = mb_convert($value[0], $value[1], $value[2]);
}
}else{
die("ここは通過しないと思いますが自信なし");
}
return $value;
}

$ary = mb_convert_encoding_deep( array($ary, "SJIS", "EUC-JP") );

array_mapの用法でも間違っているのでしょうか?

A 回答 (2件)

ANo.1のものです。


mb_convert_variables という関数がありました。
これを使えば一発でした。
ただし、これも連想配列のキーは変換しないようです。

参考URL:http://jp.php.net/manual/ja/function.mb-convert- …
    • good
    • 0

昔、同じようなものを作ったことがあります。


以下のものです。これは、連想配列のキーのエンコードは変換しません。

function CharEncConv($val, $toenc, $fromenc) {
$ret = null;

if (is_array($val)) {
foreach ($val as $k => $v) {
$ret[$k] = call_user_func(__FUNCTION__, $v, $toenc, $fromenc);
}
} elseif (is_string($val)) {
$ret = mb_convert_encoding($val, $toenc, $fromenc);
} else {
$ret = $val;
}
return $ret;
}

> array_mapの用法でも間違っているのでしょうか?

そもそもarray_mapは多次元配列には使用できません。
mb_convert_encoding_deep関数の、var_dumpのコメントアウトを解除すれば、何が起こっているのか大体わかると思います。
array_walk_recursiveを使う手はあります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!