PHP で、変数を連想配列(ハッシュ)のキーにしたい。

PHP で、
<?php

$items
[$item->id] = $item->name;

?>
のようにアクセスしたい。しかしこれではなぜかうまくいかなかった。Perl だとフツーに
<?php

$items
{$item->id} = $item->name;

?>
というように書けるのに。いったい何がいけないんだろう? 「PHP 連想配列」でググると、だいたいこんな感じの例が出てくる。
<?php

$fruits
= array(
           
'apple'  => 'りんご',
           
'orange' => 'みかん',
           
'grape'  => 'ぶどう'
         
);

?>
わかったよ、連想配列の宣言と同時に配列変数に値を入れる方法はわんさか出てくるのだ、しかし俺は動的に値を入れたいんだ。配列のキー(添字)を変数にして。たとえば次のように。
<?php

function test() {

 
// アクセスするURL
 
$url   = 'https://yourdomain.com/get_items.php';

 
// curl で $url にアクセスして XML データ $xmlstr を取得する。
 
$ch = curl_init();   // initialize
 
curl_setopt($ch, CURLOPT_URL, $url);
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
$xmlstr = curl_exec($ch);
 
curl_close($ch);

 
// XML データを処理する。
 
$xml = simplexml_load_string($xmlstr);
 
$items = array();
  foreach (
$xml->ITEM as $item) {
   
$items["$item->id"] = $item->name;
  }

  return
$items;
}

?>
というわけで、$items[$item->id] = $item->name; は、
<?php

$items
[<strong>"</strong>$item->id<strong>"</strong>] = $item->name;

?>
が正解だった。いやー悩んだ悩んだ。 キーにする変数名をダブルクォーテーション(")で囲めばよかったのだ! 2007/02/13 追記 この問題は、https://search.net-newbie.com/php/language.types.array.html の「配列ですべきこととしてはならないこと」に詳しく説明されていた。
連想配列の添字の前後は常に引用符で括る必要があります。 例えば、$foo[bar]ではなく$foo['bar']を使用してください。 しかし、 $foo[bar]はなぜ誤りなのでしょうか? 古いスクリプトで次のような構文を見たことがあるかもしれません。
<?php
$foo
[bar] = 'enemy';
echo
$foo[bar];
// etc
?>
これは間違っていますが、動作します。では、なぜ間違っているのでしょ う? その理由は、このコードには文字列('bar' - 引用符で括られてい る)ではなく未定義の定数(bar)が使用されており、PHPが同じ名前の定 数を不幸にして同じコードの中に定義する可能性があるためです。 下位互換性の維持のために未定義の定数は同じ名前の文字列に自動的に変換されるため、このコードは動作します。 例えば、barという名前の、定義されていない定数があるとすると、PHPは'bar'という文字列でそれを 置換して使用します。
トラックバック URL: https://perltips.twinkle.cc/trackback/167
Posted on 2007-01-15 by yas |