phpの再帰処理で平坦な連想配列をツリー化する方法

このQ&Aのポイント
  • phpの再帰処理を使って、平坦な連想配列をツリー状に変換する方法をご教示ください。
  • 連想配列に再帰処理をかけることで、深さの異なる要素を持つツリー状の連想配列を生成することができます。
  • 具体的なコード例を提示していただけると助かります。
回答を見る
  • ベストアンサー

phpの再帰処理で平坦な連想配列をツリー化

phpに関して質問させて頂きます。 最近、phpの勉強を始め、再帰処理でつまづいております。 具体的には、以下の様な連想配列を作り $tourist_spot = array(  'a' => array('日本','東京都','台東区','浅草','浅草寺',10),  'b' => array('日本','東京都','千代田区','大手町','首塚',5),  'c' => array('日本','千葉県','浦安市','舞浜','ディズニーランド',10),  'd' => array('日本','東京都','台東区','浅草','浅草演芸ホール',7), ); この連想配列に、再帰処理をかけて以下ようなツリー状の連想配列を生成しようと試みていますが、どうしても上手く行きません。 基本は添字に値を格納し、末端のみ値を数値として格納する感じです。 array(1) { ["日本"]=>  array(1) {   ["東京都"]=>   array(1) {    ["台東区"]=>    array(1) {     ["浅草"]=>     array(2) {      ["浅草寺"]=>      int(10)      ["浅草演芸ホール"]=>      int(7)     }    }    ["千代田区"]=>    array(1) {     ["大手町"]=>     array(1) {      ["首塚"]=>      int(5)     }    }   ["千葉県"]=>   array(1) {    ["浦安市"]=>    array(1) {     ["舞浜"]=>     array(1) {      ["ディズニーランド"]=>      int(10)     }    }   }  } } コード例などご提示頂けますと幸いですが、ややこしいようであれば、どのような考え方で望めば良いのかだけでもご教示を賜りたく存じます。 お詳しい方いらっしゃいましたら何卒、宜しくお願い申し上げます。

  • PHP
  • 回答数1
  • ありがとう数9

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

  • ベストアンサー
noname#244856
noname#244856
回答No.1

$tree = array(); foreach ($tourist_spot as $spot) {  $current = &$tree;  foreach (array_slice($spot, 0, -1) as $segment) {   if (!isset($current[$segment])) {    $current[$segment] = array();   }   $current = &$current[$segment];  }  $current = current(array_slice($spot, -1)); } unset($current); var_dump($tree);

chiku-san
質問者

お礼

いつもありがとうございます! 参照使ってできるのですね! いやあ、むちゃくちゃ毎度勉強になります。 感謝いたします! 今年も宜しくお願い申し上げます♪

関連するQ&A

  • 思うような連想配列ができない・・

    省略して説明します。 関東,東京,神奈川,千葉 中部,愛知,静岡,岐阜 関西,大阪,兵庫,京都 というCSVデータがあり これを以下のような、連想配列にしたいのですがどうすればよいのでしょうか?? Array (   [0] => Array    (      [0] => 関東      [1] => 東京      [2] => 神奈川      [3] => 千葉    )   [1] => Array    (      [0] => 中部      [1] => 愛知      [2] => 静岡      [3] => 岐阜    )   [2] => Array    (      [0] => 関西      [1] => 大阪      [2] => 兵庫      [3] => 京都    ) ) --------------------------------- CSVデータを、feofで終端まで読み込み feofで一行ずつ取得 explodeでコンマで分解まではできるのですが 上記のような、連想配列ができません・・。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • 再帰関数を用いて配列の合計を求める

    かなり(約三時間)悩んでまだ分からないので質問します。 再帰関数を用いて配列の中の数字(floatで定義されている)の合計を求めるプログラムを作っています。階乗を求めるプログラムの例を見ながらやっているのですがもう降参です。簡単だと思ったんですけど配列と組み合わせでもう頭がパニックです。どなたか答え(またはヒント)を教えてください。 よろしくお願いします。 なお、下のプログラムは私が1から作りましたので完全に間違っている可能性大です。参考にしないでください。(^^ゞ #include <iostream> using namespace std; float recur(int numF); int main() { int num; float sum; cout << "Enter an integer number: "; cin >> num; //再帰関数なんてこうやれば使わなくても出来るのに~! // for(i=0; i<num; i++) // sum += array[i]; sum = recur(num); cout << "The sum of all the numbers: " << sum << endl; return 0; } float recur(int numF) { int i; float array[numF]; //定数式が必要です、と怒られる for(i=0; i<numF; i++) return array[i] += array[i-1]; //ここに再帰の式が必要 }

  • 二つの配列を比較してループ処理

    配列1 Array ( [東京都] => 1 [神奈川県] => 2 [千葉県] => 4 [群馬県] => 1 [栃木県] => 1 ) 配列2 Array ( [品川区] => 1 [横浜市] => 2 [千葉市] => 1 [船橋市] => 1 [市原市] => 1 [浦安市] => 1 [前橋市] => 1 [宇都宮市] => 1 ) 上記の二つの配列を比較して 東京都 品川区(1) 神奈川県 横浜市(2) 千葉県 千葉市(1) 船橋市(1) 市原市(1) 浦安市(1) 群馬県 前橋市(1) 栃木県 宇都宮市(1) のように整形したいのですが、上手く出来ずに困っております。 どなたかご教授ください。 宜しくお願いいたします。

    • 締切済み
    • PHP
  • 連想配列で値が空だったら、要素を削除したいのですが

    連想配列で値が空だったら、要素を削除したいのですが、どうすればよいでしょうか? ▼元の配列 array { [1]=>"東京" [2]=>"京都" [3]=> ""←string [7]=>"横浜" [24]=>"奈良" [5]=> ""←string }    ↓ ▼こういう配列にしたい array { [1]=>"東京" [2]=>"京都" [7]=>"横浜" [24]=>"奈良" }

    • ベストアンサー
    • PHP
  • 連想配列のソートについて

    調べても分からなかったので質問させてください。 現在アクセスログ集計ツールを作成中です。 決められたurlのページにアクセスがあった時にDB登録し、カウントする単純な仕組みで、ツールの方では日にちを任意で選択してもらいエクセル出力する仕組みです。 質問させていただきたいのが、カウントをするページが例えば4ページあり、そのページ名の接頭を取って「date」「index」「login」「stock」「option」というキーの連想配列を作っています。 array(5) { ["date"]=> array(3) { [0]=> string(10) "2015/02/01" [1]=> string(10) "2015/02/02" [2]=> string(5) "total" } ["Index"]=> array(3) { [0]=> int(2) [1]=> int(4) [2]=> int(6) } ["Login"]=> array(3) { [0]=> int(6) [1]=> int(6) [2]=> int(12) } ["Stock"]=> array(3) { [0]=> int(3) [1]=> int(4) [2]=> int(7) } ["option"]=> array(3) { [0]=> int(2) [1]=> int(1) [2]=> int(3) } } このキーである「index」「login」「stock」「option」の順番が取得するデータによって入れ替わってしまいます。 理想的な順番としては「login」「index」「option」「stock」の順番にソートしたいのですが、調べても分かりませんでした。sort関数はアルファベット順とか、数値順とか決まったルールのソートができるようですが、こちらで意図的に順番を操作する事はできるのでしょうか? もしあれば教えていただきたいです、何卒よろしくお願いいたします。

    • ベストアンサー
    • 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
  • formの情報を連想配列に

    お世話になります。 formのチェックボックスの情報を連想配列に格納したいのですが □東京 □神奈川 □千葉 □埼玉 □茨城 [ 送信 ] というフォームがあったとして 東京、神奈川、千葉の3つにチェックが入り送信されると この3つの値を格納するにはどうすればよいのでしょうか? 単純に、下のようにしたくて・・・ array_pushを使うのかなと思うのですが上手くいきません。 Array ( [0] => tokyo [1] => kanagawa [2] => chiba ) ご教授お願いします。

    • ベストアンサー
    • PHP
  • javascript 連想配列

    初めて連想配列で処理を行っております。いろいろグーグル等で調べましたが、どうしてもできないので、ご教授頂けますでしょうか。 phpからjavascriptにデータを渡し、連想配列化する必要がありまして、以下の通りにやってみました。配列化は自動化したく、for文でこのようにしてみました。phpの大部分は少々長いので省きますが、ざっとこんな感じです。 var place = <?PHP echo $place ?>; //東京、大阪、名古屋 var address = <?PHP echo $add ?>; //東京都、大阪府、名古屋市 var Data = new Array();   for(i=0;i<place.length;i++){ Data[i].push({add1:place[i] , add2:address[i]});   } alert(Data[0]); ------------------------------- 上記の方法ですと、placeとaddressには正しく値はphpから渡されるのですが、肝心なDataはなにも出力されません。エラーもなく、まっさらです。 理想系は、以下の方法の通りにしたいと思っております。 下記はフリーウェアの中身を今回の案件に手直ししたものです。 Data = [{  add1: "東京",  add2: "東京都" }, {  add1: "大阪",  add2: "大阪府" }, {  add1: "名古屋",  add2: "名古屋市" }]; この場合と同じ結果が出力されれば完成なのですが・・・ 例えば、Data[0]をalertすると、「object object」と出力されます。 現在は3件で開発を行っておりますが、今後はどんどん増えていくので、自動化させるためにfor文か、for in文を使ったほうがいいのかな と思っているのですが、力及ばず詰まっております。 どうかお助けください。 よろしくお願い致します。

  • 「要素数が変動する連想配列」に、新たなキーを指定した上で、配列を追加し

    「要素数が変動する連想配列」に、新たなキーを指定した上で、配列を追加したいのですが、 どうすればよいでしょうか? 元の連想配列$hash1 "ヨーロッパ"=>"スペイン", "南米"=>"ブラジル" 追加したい配列$hash2 [0]=>"東京", [1]=>"名古屋" array_pushしたら、下記のようになりました。 "ヨーロッパ"=>"スペイン", "南米"=>"ブラジル" [0]=> ______[0]=>"東京" ______[1]=>"名古屋" これを、下記のようにするには、どうしたらよいでしょうか? "ヨーロッパ"=>"スペイン", "南米"=>"ブラジル", "アジア"=> ______[0]=>"東京", ______[1]=>"名古屋"

    • ベストアンサー
    • PHP
  • 消印スタンプは、「区」か「町」か、一体どっち?

     東京都台東区浅草から東京都某区某町に、封筒での手紙を赤ポストから投函したとします。  その場合、手紙の表面に捺される消印スタンプは、「台東区」と「浅草」のどちらでしょうか?  どうか教えて下さい。  宜しくお願い致します。

専門家に質問してみよう