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

菅原浩紀 php-users@php.gr.jp
Tue, 06 Aug 2002 21:53:39 +0900


--Boundary-8etM54FUM0Ol6GLH7p7aJ
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Content-Description: Mail message body

 菅原浩紀です。

皆様のアドバイスをいただき、データを積む
サンプルを作成するに至りました

以下プログラムで検証した結果
やりたいことの8割の確認はできました
(パフォーマンス悪いとこの直しはこれから)

某テンプレート関数に入れるデータを積み上げる
プログラムを作成したかったのでした


質問ではありませんがこれから
1.キーではなくデータのほうの配列対応
2.無駄な処理の変更
くらいやればまとまるかなと思っています。

以下確認したプログラムです

<?php
require_once("lib_az_tmpl.php");
//テンプレート展開クラス読込

//テンプレート情報クラス
$cTmpl = new az_tmpl();

//出力データ作成
$cTmpl->assign("a/b/c/d",1);

$cTmpl->setEachNum(3);
$cTmpl->assign("a/b//a",1);
$cTmpl->assign("a/b//b",2);
$cTmpl->assign("a/b//c",3);
$cTmpl->assign("a/b//d",4);
$cTmpl->setEachNum(5);
$cTmpl->assign("a/b//e//a",222);
$cTmpl->assign("a/b//e//a",333);

$cTmpl->setEachNum(3);
$cTmpl->assign("a/b//a",11);
$cTmpl->assign("a/b//b",12);
$cTmpl->assign("a/b//c",13);
$cTmpl->assign("a/b//d",14);
$cTmpl->setEachNum(5);
$cTmpl->assign("a/b//e//a",1222);
$cTmpl->assign("a/b//e//a",1333);
$cTmpl->setEachNum(0);


echo "<pre>";
print_r($cTmpl->DATA());
echo "</pre>";
?>



> 菅原浩紀です。
>
>小野さん
>
>お返事ありがとうございます
>
>//1件目のデータ
>sample("a/b//a",1,$Dim);
>sample("a/b//b",2,$Dim);
>//2件目のデータ
>sample("a/b//a",11,$Dim);
>sample("a/b//b",12,$Dim);
>
>このような感じで
>実現できました
>
>本当は下記のような(2次元)ものも検討していたのですが
>どうやら企画倒れだったようです
>
>sample("a/b//e//a",222,$Dim);
>sample("a/b//e//b",333,$Dim);
>sample("a/b//e//a",444,$Dim);
>sample("a/b//e//b",555,$Dim);
>
>これを実現できるようにちょっと
>改造してみます(セコイ手で)
>
>
>>菅原さん
>>
>>小野です。
>>お求めの仕様がようやく理解できました。
>>こんな感じでしょうか....
>>#--------------------------------------------#
>>function sample($a,$b,&$Dmy){
>>  $array=split('/',$a);
>>  $tmp=&$Dmy;
>>  $max=sizeof($array);
>>  for($i=0;$i<$max;$i++){
>>    $v=$array[$i];
>>    $n=($i<($max-1))?($array[$i+1]):(false);
>>    if($v==''){
>>      $v=0;
>>      while(isset($tmp[$v]))$v++;
>>      if($n!==false){
>>        $f=false;
>>        for($j=0;$j<$v;$j++){
>>          if(!isset($tmp[$j][$n])){
>>            $v=$j;
>>            break;
>>          }
>>        }
>>      }
>>    }
>>    $tmp=&$tmp[$v];
>>  }
>>  $tmp=$b;
>>}
>>#--------------------------------------------#
>>ただ、考えて見ると一つ問題がありそうですね。
>>例えば、
>>
>>'a/b/c',1
>>
>>のようなデータを与えた場合、次の代入が行われることになります。
>>
>>$Dmy['a']['b']['c']=1;
>>
>>つまり、$Dmyと$Dmy['a']と$Dmy['b']の3つまではは「配列」ですが、
>>$Dmy['a']['b']['c']は 1 という値を持つスカラー型になります。
>>
>>そこに、
>>
>>'a/b/c/d,2
>>
>>のようなデータを与えると、配列ではないはずの、
>>
>>$Dmy['a']['b']['c']に対して、['d']という添え字を与えることになり、
>>これはエラーになるでしょう。
>>
>>もちろん、回避は出来ますが、どのように回避するかは仕様次第ですね。
>>
>>
>>_______________________________________________
>>PHP-users mailing list
>>PHP-users@php.gr.jp
>>http://ns1.php.gr.jp/mailman/listinfo/php-users
>_______________________________________________
>PHP-users mailing list
>PHP-users@php.gr.jp
>http://ns1.php.gr.jp/mailman/listinfo/php-users
--Boundary-8etM54FUM0Ol6GLH7p7aJ
Content-Type: text/plain; charset=shift_jis;
 name="=?ISO-2022-JP?B?GyRCPzc1LCVGJS0lOSVISjg9cRsoSi50eHQ=?="
Content-Disposition: attachment; 
 filename="=?ISO-2022-JP?B?GyRCPzc1LCVGJS0lOSVISjg9cRsoSi50eHQ=?="
Content-Transfer-Encoding: BASE64

PD9waHANCg0KZGVmaW5lKCJERUZfTk9ORU5DT0RFIiwwKTsNCmRlZmluZSgiREVGX0hUTUxF
TkNPREUiLDEpOw0KZGVmaW5lKCJERUZfVVJMRU5DT0RFIiwyKTsNCg0KY2xhc3MgYXpfdG1w
bCB7DQoJdmFyICRnc0RhdGFMaXN0OwkJCQkJLy+Vz4q3g2aBW4NeDQoJdmFyICRnc0RhdGFM
aXN0RWFjaE51bSA9IDA7CQkJLy+Vz4q3g2aBW4Neg0ODk4NOg4qDgYOTg2eP6o+KDQoNCgkv
L4NSg5ODWINng4mDToNeDQoJZnVuY3Rpb24gYXpfdG1wbCgpIHsNCgl9DQoNCglmdW5jdGlv
biBzZXRFYWNoTnVtKCRsTnVtKSB7DQoJCSR0aGlzLT5nc0RhdGFMaXN0RWFjaE51bSA9ICRs
TnVtOw0KCQlyZXR1cm4gVFJVRTsNCgl9DQoNCglmdW5jdGlvbiBhc3NpZ24oJHNLZXksJHNW
YWx1ZSwkbEVuY29kZT1ERUZfSFRNTEVOQ09ERSkgew0KDQoJCS8vJHNWYWx1ZSBFbmNvZGUN
CgkJaWYgKCRsRW5jb2RlID09IERFRl9OT05FTkNPREUpIHsNCgkJfSBlbHNlIGlmICgkbEVu
Y29kZSA9PSBERUZfSFRNTEVOQ09ERSkgew0KCQkJJHNWYWx1ZSA9IGh0bWxzcGVjaWFsY2hh
cnMoJHNWYWx1ZSk7DQoJCX0gZWxzZSBpZiAoJGxFbmNvZGUgPT0gREVGX1VSTEVOQ09ERSkg
ew0KCQkJJHNWYWx1ZSA9IHVybGVuY29kZSgkc1ZhbHVlKTsNCgkJfQ0KDQoJCSRhciA9IHNw
bGl0KCcvJywkc0tleSk7DQoJCSR0bXA9JiR0aGlzLT5nc0RhdGFMaXN0Ow0KCQkkbWF4PXNp
emVvZigkYXIpOw0KDQoJCWZvcigkaT0wOyRpPCRtYXg7JGkrKyl7DQoJCQkkdj0kYXJbJGld
Ow0KCQkJJHNOZXh0ID0gKCRpPCgkbWF4LTEpKT8oJGFyWyRpKzFdKTooZmFsc2UpOw0KCQkJ
aWYoJHY9PScnKXsJCQkJCS8vlHqX8YLMj+qNhw0KCQkJCSR2PTA7DQoJCQkJd2hpbGUoaXNz
ZXQoJHRtcFskdl0pKSR2Kys7DQoJCQkJaWYoJHNOZXh0KXsJCQkJLy+On5d2kWaCqoKggumP
6o2HDQoJCQkJCS8vjEqC6JXUgrWOd5LogqqWopDdkuiCqY53kuiU1I2GgsaI6pJ2greC6YLG
gqsNCgkJCQkJaWYgKCR0aGlzLT5nc0RhdGFMaXN0RWFjaE51bSA9PSAkaSArIDEgfHwNCgkJ
CQkJCSR0aGlzLT5nc0RhdGFMaXN0RWFjaE51bSA9PSAwKSB7DQoJCQkJCQlmb3IoJGogPSAw
OyRqIDwgJHY7JGorKyl7DQoJCQkJCQkJaWYoIWlzc2V0KCR0bXBbJGpdWyRzTmV4dF0pKXsN
CgkJCQkJCQkJJHYgPSAkajsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0K
CQkJCQl9IGVsc2UgewkJCS8vkbaN3YK3gumUepfxgsyNxYzjgvCOd5LogreC6Q0KCQkJCQkJ
d2hpbGUoaXNzZXQoJHRtcFskdl0pKSR2Kys7DQoJCQkJCQlpZiAoJHYgPiAwKSAkdi0tOw0K
CQkJCQl9DQoJCQkJfSBlbHNlIHsJCQkJLy+On5d2kWaCqoLIgqKP6o2HDQoJCQkJfQ0KCQkJ
fQ0KCQkJJHRtcD0mJHRtcFskdl07DQoJCX0NCgkJJHRtcD0kc1ZhbHVlOw0KDQoJfQ0KDQoJ
ZnVuY3Rpb24gREFUQSgpIHsNCgkJcmV0dXJuICR0aGlzLT5nc0RhdGFMaXN0Ow0KCX0NCg0K
fQ0KPz4NCg==
--Boundary-8etM54FUM0Ol6GLH7p7aJ--