人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpで再帰的な処理をしたい関数が複数の引数を持つ場合について教えてください。

function hoge($value){
if(is_array($value)){
return array_map('hoge',$value);
}else{
return fuga($value);
}
}
function fuga($a){
return $a * 2;
}

fugaの引数が1つだとarray_mapで回せますが、
fuga($a,$b)のように引数が複数の場合はどのように
書けば良いのでしょうか?

ご存知のかたご教示下さい。

●質問者: soyuz11
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど
●50ポイント ベストアンサー

array_map は複数の配列に対応していますので、
例えば下記のような具合に利用することが出来ます。

<?php
function hoge($v1, $v2){
 if(is_array($v1) && is_array($v2)){
 return array_map('hoge', $v1, $v2);
 } else {
 return fuga($v1, $v2);
 }
}
function fuga($a, $b){
 return $a * $b;
}

$a = array( array(1,2,3,4,5), array(11,12,13,14,15), array(21,22,23,24,25) );
$b = array( array(10,20,30,40,50), array(100,200,300,400,500), array(1000,2000,3000,4000,5000) );

print_r(hoge($a, $b));

http://jp2.php.net/manual/ja/function.array-map.php


soyuz11さんのコメント
早速有難うございます♪ 複数配列にも対応していたのですね。。。 if(is_array($v1) && is_array($v2)){ return array_map('hoge', $v1, $v2); $v2が配列でなく常にただの文字列でも 問題ないのでしょうか? ※その場合array判定は$v1だけで良いかとは思いますが…

うぃんどさんのコメント
>array判定は$v1だけ どちらも必ず配列であるという場合はご指摘のとおり$v1だけで良いです。 言い訳:下記のようなトラップを回答しようとして、 「あまり良い例では無い」と思い直して消した後が回答のコードです。 >|php| } elseif(is_array($v1)){ return array_map('hoge', $v1, array($v2)); } elseif(is_array($v2)){ return array_map('hoge', array($v1), $v2); ||<

soyuz11さんのコメント
有難うございます! >} elseif(is_array($v1)){ > return array_map('hoge', $v1, array($v2)); array($v2)としているのは array_mapが配列しか受け付けないという事なんでしょうか? 重ね重ねすみません。

うぃんどさんのコメント
互いに配列であれば、長いほうの配列の個数に自動拡張してくれます。 片方がスカラーであれば、配列のほうが削られる結果となります。 テストデータを少し改変しました。 >|php| <?php function hoge($v1, $v2){ if(is_array($v1) && is_array($v2)){ return array_map('hoge', $v1, $v2); } elseif(is_array($v1)){ return array_map('hoge', $v1, array($v2)); } elseif(is_array($v2)){ return array_map('hoge', array($v1), $v2); } else { return fuga($v1, $v2); } } function fuga($a, $b){ return $a * $b; } $a = array( array(1,2,3,4,5), 11, array(21,22,23,24,25) ); $b = array( array(10,20,30,40,50), array(100,200,300,400,500), 1000 ); print_r(hoge($a, $b)); ||< 結果は下記です。 >|| Array ( [0] => Array ( [0] => 10 [1] => 40 [2] => 90 [3] => 160 [4] => 250 ) [1] => Array ( [0] => 1100 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) [2] => Array ( [0] => 21000 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) ||< array($v1)やarray($v2)を$v1、$v2のままにした結果は下記となります。 >|| Array ( [0] => Array ( [0] => 10 [1] => 40 [2] => 90 [3] => 160 [4] => 250 ) [1] => [2] => ) ||<

soyuz11さんのコメント
array($v2)の内容が'abc'の場合 [1] => Array ( [0] => 'abc' [1] => 'abc' [2] => 'abc' [3] => 'abc' [4] => 'abc' ) とは出来ないんでしょうかね? $vをcount()して同じ分だけ生成すれば 良いのでしょうが。。。。

うぃんどさんのコメント
>同じ分だけ生成 array($v2) じゃなくて array_fill(1,count($v1),$v2)を使うなど、 方法はいろいろありますが、そのようなことが必要な場面に遭遇したことが無いので、 「必要ならば・・・」という返事しか出来ないです

soyuz11さんのコメント
有難うございます。 すいません長々とお付き合いいただいて! とても参考になりました。

2 ● chokobo
●50ポイント

call_user_func_arrayが簡便かと

http://php.net/manual/ja/function.call-user-func-array.php


soyuz11さんのコメント
これはスゴイです。 ぜひ使わせて頂きます。 いろんな関数があっても使う場面がないと 宝の持ち腐れですね。 有難うございました!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ