プロが教えるわが家の防犯対策術!

いつもお世話になります。
$key='aaa';
$Ary["$key"]='xxxx';
は、できます。
ここで、
$Ary[aaa][bbb][ccc]='zzzzz';
と、したくかつ、キーを変数で指定したいのです。

そこで、
$key='[aaa][bbb][ccc]';
$Ary"$key"='zzzz';
ダメです。

$key='aaa][bbb][ccc';
$Ary["$key"]='zzzz';
これもダメです。

ここの例ですと、3次元ですが、次元数も不確定です。
方法はないものでしょうか。
なんとかよろしくお願いいたします。

A 回答 (5件)

> 最初の


> eval("$b=$str;");
> で、$bに$strの値が入らないことをいまいち理解できませんが

eval()関数は 変数の中身を 展開した状態で、PHPとして処理します。
なので、上記の場合だと、

$b の中身、 $Ary[aaa][bbb][ccc] に $str の中身、mogeeeeee を 代入している事になります。

PHPの内部では、
$Ary[aaa][bbb][ccc] = "mogeeeeee";
として、実行されてるって事です。
    • good
    • 1
この回答へのお礼

bm_hiroさん、ご丁寧にありがとうございます。
お陰で理解できました。
$key = "[aaa][bbb][ccc]";
$b = "\$Ary" . $key;
$str = "mogeeeeee";
eval("$b=$str;");
print '$b='.$b.'<br>';
--->$Ary[aaa][bbb][ccc]
$c=$Ary;
echo '$c='.$c.'<br>';
--->Array
期待通りです。
どうもありがとうございました。

お礼日時:2010/04/05 15:00

配列を文字列で表現したい場合はserial-unserialが使えるかもしれません。



<?
$str='a:1:{s:3:"aaa";a:1:{s:3:"bbb";a:1:{s:3:"ccc";s:4:"zzzz";}}}';
$ary= unserialize($str);
print_r($ary);
?>
    • good
    • 0
この回答へのお礼

yambejpさん、レスありがとうございます。
unserialize()、こんな関数もあるのですね。
恐れ入ります。
どうも教えていただきありがとうございました。

お礼日時:2010/04/05 14:51

<?


$key = "[aaa][bbb][ccc]";

$Ary[aaa][bbb][ccc] = "hogeeeee";
print $Ary[aaa][bbb][ccc] . "<hr>";

$b = "\$Ary" . $key;
$str = "mogeeeeee";
eval("$b = $str;");

print "$b<hr>";
print $Ary[aaa][bbb][ccc] . "<hr>";
exit;
?>

正直、自分でも こんな使い方が出来るとは思いもしませんでした。
試しにやってみたら、期待通りの結果が出ただけでした。

・参照 eval()関数
http://www.phppro.jp/phpmanual/php/function.eval …
    • good
    • 0
この回答へのお礼

bm_hiroさん、お早うございます。
レスありがとうございます。
$key = "[aaa][bbb][ccc]";
$b = "\$Ary" . $key;
$str = "mogeeeeee";
eval("$b=$str;");
print '$b='.$b.'<br>';
--->$b=$Ary[aaa][bbb][ccc]
$b="aaa";
echo '$b='.$b.'<br>';
--->aaa
ということで、$keyを変数とした多次元配列ができました。
ありがとうございました。
最初の
eval("$b=$str;");
で、$bに$strの値が入らないことをいまいち理解できませんが。
eval()が値を評価するだけで、その変数に値を入れるということはないということなのかと。

お礼日時:2010/04/05 09:40

ちょうどついこの間自分のプロジェクトで必要で書いた関数が、目的に合いそうなので改造してみました。


私の場合は、検索が必要だったので、以下のような形。

//ツリー状の配列から、複数のキーで配列の値を検索する
function SeekArray($TargetArray,$keys){
//Keysには.で繋がれたキーが格納されている
return SeekArray_Recursive($TargetArray,explode('.',$keys));
}

//再帰呼び出しで複数のキーで配列の値を検索する
function SeekArray_Recursive($items, $keys, $index=0){
//検索対象が配列であることを確認
if (is_array($items)){
//キーが存在するか確認
if (array_key_exists($keys[$index],$items)){
//指定されたキーの一番最後を検索中
if ($index == count($keys)-1){
//キーが存在したため値を返す
return $items[$keys[$index]];
}elseif ($index < count($keys)){
//キーはまだ途中、さらに検索が必要
//再帰呼出
return SeekArray_Recursive($items[$keys[$index]],$keys,$index+1);
}
}
}

//見つからなかったためFALSEを返す
return false;
}

-----改造後
//ツリー状の配列から、複数のキーで配列の値を設定する
function SetSeekArray($TargetArray,$keys,$value){
//Keysには.で繋がれたキーが格納されている
return SetSeekArray_Recursive($TargetArray,explode('.',$keys),$value);
}

//再帰呼び出しで複数のキーで配列の値を設定する
function SetSeekArray_Recursive($items, $keys,$value, $index=0){
//検索対象が配列であることを確認
if (is_array($items)){
//キーが存在するか確認
if (array_key_exists($keys[$index],$items)){
//指定されたキーの一番最後を検索中
if ($index == count($keys)-1){
//キーが存在したため値を設定
$items[$keys[$index]]=$value;
return true;
}elseif ($index < count($keys)){
//キーはまだ途中、さらに検索が必要
//再帰呼出
return SetSeekArray_Recursive($items[$keys[$index]],$keys,$value,$index+1);
}
}
}

//見つからなかったためFALSEを返す
return false;
}

この回答への補足

BellBellさん、お早うございます。
その後教えていただいたスクリプトを何とか理解しようと努めまして、
ようやくできました。
bm_hiroさん、yambejpさん、i80286さん、どうもありがとうございました。

補足日時:2010/04/10 06:03
    • good
    • 0
この回答へのお礼

BellBellさん、レスありがとうございます。
>//ツリー状の配列から、複数のキーで配列の値を検索する
と、いうことで
私が行おうとしていることそのもののような気がしました。
未熟者故すぐに理解できないところがあります。
教えていただいた方法をゆっくり試してみます。
また、結果をご報告します。
ありがとうございました。

お礼日時:2010/04/04 12:29

まず確認ですが、ご質問文にある


>>
$key='aaa';
$Ary["$key"]='xxxx';
<<
は間違いではありませんが、普通は
$key='aaa';
$Ary[$key]='xxxx';
と書きますよね。

そこで、
$Ary[$aaa][$bbb][$ccc]='zzzzz';
のように変数で添え字を指定するのではいけないのですか?
    • good
    • 0
この回答へのお礼

i80286さん、早速レスありがとうございます。
再帰呼び出しで、値をたどりたいため、
>$Ary[$aaa][$bbb][$ccc]='zzzzz';
の方法ではできなかったのですが。
どうも貴重なレスありがとうございます。

お礼日時:2010/04/04 12:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!