長文で失礼します。
array_mapでの再帰処理がうまく行かないのでどこが間違っているか教えてください。
まず、このような配列があります。配列の中に配列があります。
$ary = array(1, 2, null, array("a", null, "c"));
この配列の中のnullを"なし"という文字列に変換したいです。
array_mapを使って再帰的にやってみました。
まずはうまく行ったコードから。
------------------------------------------------------
$ary = array(1, 2, null, array("a", null, "c"));
var_dump(null2Nashi($ary));
// nullを"なし"に置換する関数
function null2Nashi(
$in_array
){
if(is_array($in_array)){
return array_map("null2Nashi", $in_array);
} else {
if ($in_array === null){
$in_array = "なし";
}
return $in_array;
}
}
------------------------------------------------------
結果はnullが"なし"に変換されました
array (size=4)
0 => int 1
1 => int 2
2 => string 'なし' (length=6)
3 =>
array (size=3)
0 => string 'a' (length=1)
1 => string 'なし' (length=6)
2 => string 'c' (length=1)
そしてこの"なし"をコード内で指定するのではなく引数で指定したいと思って無名関数を使って以下のコードにしました。
------------------------------------------------------
$ary = array(1, 2, null, array("a", null, "c"));
var_dump(null2Str($ary, "なし"));
// nullを指定文字列に置換する関数
function null2Str(
$in_array,// null値を含む配列
$in_str// null値を変換したい文字列
){
$n = function($n_array) use($in_str){
if(is_array($n_array)){
return array_map($n, $n_array); //…(1)
} else {
if ($n_array === null){
$n_array = $in_str;
}
return $n_array;
}
};
return $n($in_array);
}
------------------------------------------------------
結果はnullは何も変換されませんでした。
array (size=4)
0 => int 1
1 => int 2
2 => null
3 =>
array (size=3)
0 => string 'a' (length=1)
1 => null
2 => string 'c' (length=1)
どうやら(1)のarray_mapが動作していないようです。要素を分解せずに$nの無名関数に渡さずにそのまま第2引数を返しているだけみたいです。
何か対応方法があるでしょうか?
どうぞよろしくお願い致します。
No.3ベストアンサー
- 回答日時:
あー、なんで誤りに気づかなかったか分かりました。
php.iniの設定で一部のエラーが隠蔽されているからです。おそらくerror_reporting = E_ALL & ~E_NOTICE
になっているんじゃないですかね。ところがE_NOTICEはデバッグ上非常に重要なエラーで、これを隠蔽してしまうことはデバッグ作業を困難にします。よって
error_reporting = E_ALL | E_STRICT
にしてすべてのエラーを表示させてください。恒久的ではなく、PHPスクリプト実行中に一時的に変更したい場合はerror_reporting関数を使って
error_reporting(E_ALL | E_STRICT);
としてください。また、下記リンクで未定義とNULLの違いの再確認をお願いします。
Qiita - 【PHP入門講座】 NULLと未定義の違い
http://qiita.com/mpyw/items/0a4ea0bc9a695da33f0c
さて、先ほどのコードを実行してみると分かるのですが
http://ideone.com/ZrWoN2
このように
PHP Notice: Undefined variable: n
が発生してしまっていますね。そしてその部分はNULLと見なされ、一見array_mapのコールが失敗するように思われるのですが…実は、array_mapはNULLも第1引数に取ることが出来るのです。
PHP Manual - array_map
http://php.net/manual/ja/function.array-map.php
以上の例4が該当しますね。
ありがとうございます!
たしかにerror_reporting = E_ALL & ~E_NOTICEとしていました…。
NULLと未定義の件も了解しました。
今回の件でいろいろ見直したほうが良さそうですね。
重ね重ねお礼を申し上げます。
No.2
- 回答日時:
既存のコードのuse句での受け渡しについてですが、これだと無名関数スコープ内から無名関数自身を参照することが出来ないので、
$n = function($n_array) use($in_str) { ... }
としている部分を
$n = function($n_array) use($in_str, &$n) { ... }
にする必要があります。
ありがとうございます!
無名関数の部分、そうだったのですね・・・。
たしかにuse($in_str, &$n)としましたらうまく動作しました。
これはちょっと気づかなかったです。
No.1
- 回答日時:
反則技かもしれませんが、array_walk_recursiveではダメですか?array_mapは値を返す関数ですが、array_walk・array_walk_recursiveは参照渡しで値を編集する関数ですね。
array_walkはforeachとほとんど出来ることに差はないですが、array_walk_recursiveは単純なforeachには出来ない強力な特長を持っています。$array = array(1, 2, null, array('a', null, 'c'));
array_walk_recursive($array, function (&$v) {
if ($v === null) {
$v = 'なし';
}
});
ありがとうございます!
array_walk_recursive、知らなかったです。
PHPは本当に便利な関数が多いですね。
これを機にもっと勉強しようと思います^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP ワードプレスサイト PHP8.0.25でのWarningエラー 1 2023/06/12 11:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
CArrayの要素としてCStringArra...
-
verilogで、配列の一部をタスク...
-
STLのvectorで作った配列をメン...
-
ネットショップシステムでカー...
-
php で1から100までの素数の表...
-
配列の添え字が小数だとどうなる?
-
PHPとMySQLで100万件のデータを...
-
濁点のソート
-
C言語 最大値と最小値を求めて...
-
プログラミングのPythonのnoteb...
-
スカラーのベクトル微分
-
Texでの数式
-
配列 一部除外してソート?
-
日付、時間の2段階でソート
-
別ファイルの構造体の値を読み...
-
foreachのなかで次のキーを参照...
-
プルダウンメニューにDBの内容...
-
行数が30万件ほどあるCSVから、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スカラーのベクトル微分
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
ファイルの書き込みについて教...
-
php で1から100までの素数の表...
-
C言語の配列をPush(追加)する...
-
配列の要素(value)に、変数を...
-
STLのvectorで作った配列をメン...
-
C言語 最大値と最小値を求めて...
-
行列
-
verilogで、配列の一部をタスク...
-
CArrayのソート
-
PHPのセレクトボックスの初期値...
-
Perlで重複行を削除したい
-
pythonのnumpyでの繰り返しでの...
-
System.String.Splitでエラー
-
連想配列から<th>を含むテーブ...
-
2次元配列CSVのソート
-
【PHP】配列のキー名の修正は可...
-
Pager::factory()の使い方がわ...
おすすめ情報