[PHP-users 9041] Re: 文字列から配列データの格納について

菅原浩紀 php-users@php.gr.jp
Thu, 01 Aug 2002 00:04:04 +0900


 菅原浩紀です。

小野さんぢょ〜さんお返事ありがとうございます

私の説明が悪かったです

キーのないデータは配列として格納するのですが
下の例に示しますがDBやCSV等の情報を格納しようと考えておりました




//1件目のデータを格納
sample("a/b//a",1,$Dim);
sample("a/b//b",2,$Dim);
sample("a/b//c",3,$Dim);
sample("a/b//d",4,$Dim);
//2件目のデータを格納
sample("a/b//a",11,$Dim);
sample("a/b//b",12,$Dim);
sample("a/b//c",13,$Dim);
sample("a/b//d",14,$Dim);

とコーディングしたとすると

Dmy["a"]["b"][0]["a"] = 1;
Dmy["a"]["b"][0]["b"] = 2;
Dmy["a"]["b"][0]["c"] = 3;
Dmy["a"]["b"][0]["d"] = 4;
Dmy["a"]["b"][1]["a"] = 11;
Dmy["a"]["b"][1]["b"] = 12;
Dmy["a"]["b"][1]["c"] = 13;
Dmy["a"]["b"][1]["d"] = 14;

と同等としたかったのです
なので

試してみたのですが
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]

とガンガン配列の値が増えていってしまいます
(この点をすっかり忘れていました)

気づいたのですがこれを実現するには下のキーの存在チェックを
しなければならないですね、それも下のキーも配列ならそれもチェックとか
考えると再帰関数でチェックして
格納する場所を決めてから格納というプロセスになりそうです

皆様のサンプルを参考に考えます
ありがとうございました。
納得できるものができたらこちらでご報告いたします


>小野です。
>
>evalではどうも、配列要素が空の場合の判定に問題があるようですね。
>次のようなコードでいかがでしょうか。
>------------------------------
>1  function sample($a,$b,&$Dim){
>2    $array=split('/',$a);
>3    $tmp=&$Dim;
>4    foreach($array as $v){
>5      if($v==''){
>6        $v=0;
>7        while(isset($tmp[$v]))$v++;
>8      }
>9      $tmp=&$tmp[$v];
>10    }
>11    $tmp=$b;
>12 }
>13 $Dim=array();
>14 sample("a/b/c/d",1,$Dim);
>15 sample("a/b//d",2,$Dim);
>16 print_r($Dim);
>------------------------------
>途中、6,7行目で空配列の場合の指数の選定をしていますが、
>ここのところを、
>
>$v=(isset($tmp))?(sizeof($tmp)):(0);
>
>のように本当はしたいところです。
>
>ただ後者の場合、15行目の関数による代入が、
>
>$Dim["a"]["b"][0]["d"]=2;
>
>とはならず、
>
>$Dim["a"]["b"][1]["d"]=2;
>
>になります。
>もし、これで問題ないのであれば、実行速度そのものは後者
>の方が勝るでしょう。
>
>
>_______________________________________________
>PHP-users mailing list
>PHP-users@php.gr.jp
>http://ns1.php.gr.jp/mailman/listinfo/php-users