- ベストアンサー
参照変数の親配列を取得する方法
- 参照変数から親配列を取得する方法について質問しています。
- 質問文章では、データの多次元配列の中で稀にキー値を使用したい場合があるため、中身の値だけを引数に渡す方法ではなく、親配列でのキー値を取得したいと考えていると述べています。
- 現在は、処理が必要なデータ行に対してキー値を事前に入れる方法を使用しているが、より効率的な方法があれば知りたいとしています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
この設計だと A. 中身にキー値をあらかじめ入れてしまう B. 追加の引数として渡す のどちらかしかないですね。するしかないというか、こうするのが最も自然な実装になると思います。無駄とか気にする必要は無く。 蛇足ですが、書いてきたコードを整理するのであればもう少しOOPでまとめあげてもいい感じはしますね。Wordpressのように全てグローバル関数で書こうとするのは悪しき習慣なので倣う必要は無いです。
その他の回答 (3)
あとですね…ファンクショナルに書くと決めたら、「foreachは使わない」「全部コールバックとreturnで書く」ぐらい徹底したほうがスッキリしますね。動作速度を気にしていたらそもそもファンクショナルに書く云々以前にまずPHPを使いませんし。 【例】 <?php $input = [ 'half_width_katakana' => [ 'function' => 'to_full_width', 'data' => ['ア', 'イ', 'ウ'], // 半角カナに直してください ], 'full_width_katakana' => [ 'function' => 'to_half_width', 'data' => ['ア', 'イ', 'ウ'], ], ]; $f = [ 'to_full_width' => function ($v) { return mb_convert_kana($v, 'KVS', 'UTF-8'); }, 'to_half_width' => function ($v) { return mb_convert_kana($v, 'kvs', 'UTF-8'); }, ]; $output = array_map(function ($v) use ($f) { return [ 'processed_by' => $v['function'], 'data' => array_map($f[$v['function']], $v['data']), ]; }, $input); print_r($output);
お礼
foreachのとこはウソですね、すいません より実態に近く書くなら foreachのところは echo hoge('a'); function hoge($name){ $arr2=get_current_arr2(); return $fncs[$arr2[$name]['fnc']](get_value_from_db($name),$arr2[$name]); } ってかんじのほうが近いです こういうことをしている目的は 出力の処理の手順の強制的な統一です 以前はDBからの出力のタイプが増えるたびに 関数を新たに書いていたのですが 処理の手順が違うために使い回しが効かなかったり 名前が違うだけで同じことやってるのがあったり 書いた本人さえもはやどんな関数書いたか覚えてないなど 収拾がつかなくなってきたので 今後の拡張を効率的にするためにも 柔軟性は捨てて窓口を一つにした感じです
(追記) もしforeachの記述と$fncsの記述が同じスコープ内にある場合、 function(&$arr) { ... } の部分を function(&$arr) use (&$key) { ... } にすれば参照出来なくもないです。但し関数的記述のセオリーからは大きく逸れてしまう上に、この上ない密結合になってしまいます。私ならば絶対採用しません。
そんな方法はありません。 というより、設計からしていろいろ問題がありそうな感じがしますね… 具体的な実装目的を提示していただければもうちょっとヒントが出せるかもしれません
お礼
回答ありがとうございます 目的としては簡単に言うとDBからの出力の関数を データタイプによって動的に選択して出力する その際にいくつかの設定値も渡すというものです 例えばDBの値が画像IDであるなら その画像のURLをsrcに入れたimgのコードを出力する その際に出力サイズなどの設定値がはいった配列も渡す などといった感じです ほとんどの場合設定値さえ渡せば事足りるのですが 稀にキー値を使いたいものが出てくるという感じです
お礼
ありがとうございます とりあえず現状すでにAの方法をとっているので これでいっとこうと思います