PHPの再帰関数で配列の最後の要素を取り除きたい方法

このQ&Aのポイント
  • PHPの再帰関数を使用して配列の最後の要素を取り除きたい場合、array_pop($array)やunset($array[count($array) - 1])を使用しても望んだ結果が得られません。
  • 再帰関数を実行するたびに、新しい配列を生成したい場合は、関数内で配列を変数に代入し、再帰呼び出しの際にその新しい配列を引数として渡す必要があります。
  • 以下は正しい動作をする再帰関数の例です。 function saiki($array) { if(count($array) === 1) { return $array; } else { array_pop($array); return saiki($array); } } $result = saiki(array('いちご', 'みかん', 'りんご', 'すいか')); var_dump($result); この例では、再帰呼び出しの際に新しい配列を引数として渡すことで、望んだ結果を得ることができます。
回答を見る
  • ベストアンサー

PHPの再帰関数について

下記のように関数を作りましたが、思うような結果が出ません。 function saiki($array){ if(count($array) === 1){ return $array; } else { array_pop($array); saiki($array); } } var_dump(saiki(array('いちご', 'みかん', 'りんご', 'すいか'))); /* 欲しい結果 /* array(1) { /* [0]=> /* string(9) "いちご" /* } /* /* /* 実際の結果 /* array(4) { /* [0]=> /* string(9) "いちご" /* [1]=> /* string(9) "みかん" /* [2]=> /* string(9) "りんご" /* [3]=> /* string(9) "すいか" /* } count($array) が 1 じゃなければ array_pop($array) した配列を引数として、再帰的に saiki($array) しているつもりなのですが。。。 array_pop($array) じゃなく unset($array[count($array) - 1]) みたいなことをしても結果は一緒でした。 どうすれば欲しい結果がとれるか(count($array) が 1 以外なら再帰的に繰り返す)、どなたかご教授ください。 よろしくお願いします。

  • drm54
  • お礼率100% (12/12)
  • PHP
  • 回答数2
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

実際の結果はどうやって出力させたのでしょうか。 手元では,NULLとなりましたし,それが妥当です。 # $arrayに2個以上の要素があった場合,関数の戻り値がないから。 saiki内でsaikiを呼び出した戻り値を,ちゃんと関数の戻り値にしないといけません。 > saiki($array); return saiki($array);

drm54
質問者

お礼

あぁ、、、return!! ありがとうございます!おかげさまで正しく処理出来ました! 本当にありがとうございます!

その他の回答 (1)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

これって再帰で処理するようなものなんですかね? while (count($array) > 1) { array_pop($array); } return $array; だけでいい話では? 再帰を使うのは function saiki($array) { foreach ($array as $val) { if (is_array($val)) { saiki($val); } } } のように階層を辿って処理するのが普通です(そのための「再帰」です)。

drm54
質問者

お礼

実際の処理ではそのように階層をたどるようになっております。今回のは重要部分だけを抜き出したような形です。 説明が足りず、すみませんでした。 ありがとうございます!

関連するQ&A

  • [PHP]ループ内の配列取得、表示について

    質問させていただきます。 データをDBから取得しwhileで全てのデータを配列として出力しているとします。 (whileの中で出力し、3つのデータがあるため3回ループされている) 結果 array(1) { [0]=> string(5) "17:10" } array(2) { [0]=> string(5) "17:10" [1]=> string(5) "17:25" } array(3) { [0]=> string(5) "17:10" [1]=> string(5) "17:25" [2]=> string(5) "11:15" } 現在の出力内容は、 var_dump[$hoge[0]] 出力結果 string(5) "17:10" string(5) "17:10" string(5) "17:10" var_dump[$hoge[1]] 出力結果 NULL string(5) "17:25" string(5) "17:25" var_dump[$hoge[2]] 出力結果 NULL NULL string(5) "11:15" という出力になっていますが、最後のarray(3)の部分だけを抜き出したいです。 その場合はどのようにすればよいのでしょうか? -理想の結果- 利用したいのはarray(3)の部分だけ。 var_dump[$hoge[0]] "17:10" var_dump[$hoge[1]] "17:25" var_dump[$hoge[2]] "11:15" 説明不足かもしれませんが、よろしくお願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • array_mapの再帰処理がうまく行かない

    長文で失礼します。 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引数を返しているだけみたいです。 何か対応方法があるでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • エクセル 関数

    りんご   8 みかん   13 ぶどう   5 スイカ   2 いちご   4 の場合 みかん   13 りんご   8 ぶどう   5 いちご   4 スイカ   2 にできますか? =LARGE(* *)で数字は大→小に並べますが隣の文字(果物)も 一緒に動かしたいのです よろしくお願いします

  • PHPで配列を元に新しく配列を生成するには?

    下記のような配列があります。 Array ( [0] => Array ( [no] => 13 [item] => りんご [kosuu] => 1 ) [1] => Array ( [no] => 13 [item] => みかん [kosuu] => 1 ) [2] => Array ( [no] => 13 [item] => いちご [kosuu] => 1 ) [3] => Array ( [no] => 13 [item] => ぶどう [kosuu] => 1 ) [4] => Array ( [no] => 13 [item] => 梨 [kosuu] => 1 ) [5] => Array ( [no] => 13 [item] => スイカ [kosuu] => 1 ) [6] => Array ( [no] => 13 [item] => バナナ [kosuu] => 1 ) [7] => Array ( [no] => 14 [item] => キャベツ [kosuu] => 1 ) [8] => Array ( [no] => 11 [item] => アジ [kosuu] => 1 ) [9] => Array ( [no] => 12 [item] => 豆腐 [kosuu] => 1 ) ) この配列を使用して下記のようなHTMLのタグでTABLEを生成しようと考えています。 ------------------------------------------ |りんご   |みかん   |いちご   | ------------------------------------------ |ぶどう   |梨     |スイカ   | ------------------------------------------ |バナナ   |      |      | ------------------------------------------ |キャベツ  |      |      | ------------------------------------------ |アジ    |      |      | ------------------------------------------ |豆腐    |      |      | ------------------------------------------ 上記の配列を元に下記のように配列データを作成するにはどうしたらいいでしょうか。 Array ( [0] => Array ( [no] => 13 [item] => りんご [kosuu] => 1 ) [1] => Array ( [no] => 13 [item] => みかん [kosuu] => 1 ) [2] => Array ( [no] => 13 [item] => いちご [kosuu] => 1 ) [3] => Array ( [no] => 13 [item] => ぶどう [kosuu] => 1 ) [4] => Array ( [no] => 13 [item] => 梨 [kosuu] => 1 ) [5] => Array ( [no] => 13 [item] => スイカ [kosuu] => 1 ) [6] => Array ( [no] => 13 [item] => バナナ [kosuu] => 1 ) [7] => Array ( [no] => 13 [item] =>   [kosuu] => 0 ) [8] => Array ( [no] => 13 [item] =>   [kosuu] => 0 ) [9] => Array ( [no] => 14 [item] => キャベツ [kosuu] => 1 ) [10] => Array ( [no] => 14 [item] =>   [kosuu] => 0 ) [11] => Array ( [no] => 14 [item] =>   [kosuu] => 0 ) [12] => Array ( [no] => 11 [item] => アジ [kosuu] => 1 ) [13] => Array ( [no] => 11 [item] =>   [kosuu] => 0 ) [14] => Array ( [no] => 11 [item] =>   [kosuu] => 0 ) [9] => Array ( [no] => 12 [item] => 豆腐 [kosuu] => 1 ) [9] => Array ( [no] => 12 [item] =>   [kosuu] => 0 ) [9] => Array ( [no] => 12 [item] =>   [kosuu] => 0 ) ) すみませんがご教授お願いします。 宜しくお願いします。 失礼します。

    • 締切済み
    • PHP
  • 配列の中身を入れ替える方法

    非常に初心者的な問題だとは思いますがよろしくお願いします Array ( [0] => みかん [1] => りんご [2] => バナナ [3] => キウイ [4] => メロン [5] => スイカ) 上記のような配列があったとしまして、 [2] => バナナ [3] => キウイ [4] => メロン を、 [2] => イチゴ [3] => もも [4] => さば に変更したいのですが、 どのようにすればよいでしょうか・・・ かれこれ2日ほどやっているのですがわかりません・・・ よろしくお願いします。

    • 締切済み
    • PHP
  • PHP 配列

    多重の質問申し訳ございません。現在配列をvar_dumpすると array(3) { [0]=> string(32) "hogehoge" [1]=> string(32) "pipyup4646" [2]=> string(9) "1000%" } array(3) { [0]=> string(32) "testtest" [1]=> string(32) "kodsaf45454” [2]=> string(9) "500%" } prinfをしましたら出力結果が array(英語,英数字,値); という形になっているみたいです。 これを[英語][英数字] = 値というのは可能でしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • エクセル関数【指定条件で繰り返し】

    色々検索やら、考えてみたのですが、解決できずで質問させていただきました。 エクセル2003なのですが、やりたい内容としては    A    B     1    1     りんご 2    1     みかん 3    2    すいか 4    1    なし 5    3    いちご ・・・ ・・・ ・・・ という内容を、別シートに関数でA1から    A   1    りんご 2    みかん 3    すいか 4    すいか 5    なし 6    いちご 7    いちご 8    いちご ・・・ ・・・ ・・・ という形でできればと思っているのですが。 どなたか教えてくださると助かります!! やはり固定の数字でないと中々難しいでしょうか?ひねっても全然頭にでてきません。。。

  • 文章のルール

    次の例文の中で一番スマートな文はどれですか? ①私は、りんごやみかん、スイカ、いちごが好きだ。 ②私は、りんご、みかん、スイカやいちごが好きだ。 ③私は、りんご、みかん、スイカ、いちごが好きだ。 単語を並べるときのルールがあったような… 教えてください。

  • 言葉を並べる

    好きな食べ物は、りんごとみかんとバナナとイチゴとスイカです。 好きな食べ物は、りんご、みかん、バナナ、イチゴ、スイカです。 好きな食べ物は、りんご・みかん・バナナ・イチゴ・スイカです。 のどれが正しいですか?

  • ある文字を含む文字列のみ配列にする方法

    var_dump($text); を行うと array(1) { [0]=> string(XX) "あいさつ" } array(1) { [0]=> string(XX) "いい日旅立ち" } array(1) { [0]=> string(XX) "りんご、うまい" } array(1) { [0]=> string(XX) "メロン好き" } …… となるような変数 $text があり、そこから $key = array("ばなな","りんご","メロン"); の配列内にある文字列を含むものだけを新たに格納したいです。 自分では foreach($text as $value){ if(in_array($value, $key)){ $key_text[] = $value; } } と書いて試したのですが、NULLと返ってきてしまいます。 どうやって書けばいいか教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP