6

私は次のコードを持っています:

foreach($foo as $n=>$ia) {
    foreach($ia as $i=>$v) {
    $bar[$i]->$n = $v; //here I have 'Creating default object...' warning
    }
}

追加した場合:

$bar[$i] = new stdClass;
$bar[$i]->$n = $v;

それを修正します。次に、配列'bar'のオブジェクトの値は設定されません。たとえば、私は配列を持っています:

 $foo = array(
 "somefield" => array("value1", "value2", "value3"),
 "anotherfield" => array("value1", "value2", "value3")
 );

出力で私は得るべきです:

$bar[0]->somefield = value1
$bar[1]->anotherfield = value2

しかし実際には、次のようになります。

$bar[0]->somefield = null //(not set)
$bar[1]->anotherfield = null //too

コードを機能させるには、どのようにコードを更新する必要がありますか?

4

2 に答える 2

7

問題:

コードの問題は、最初の試行を使用する場合、

$bar[$i]->$n = $v;

->存在しない配列インデックスで演算子を使用すると、デフォルトの空のオブジェクトが作成されます。(ヌル)。これは悪いコーディング方法であるため、警告が表示されます。

2回目の試み

$bar[$i] = new stdClass;
$bar[$i]->$n = $v;

$bar[$i]各ループを上書きすると、単に失敗します。

ところで、上記のコードはPHP5.3でも機能しません


解決:

次のコード例をお勧めします。理由は次のとおりです。

  • 警告なしで動作します:)
  • あなたの質問のようにインライン初期化機能を使用しません。$bar明示的に空として宣言array()し、次を使用してオブジェクトを作成することは、コーディングの良い習慣だと思いますnew StdClass()
  • 記述的な変数名を使用して、コードが何をしているのかを理解するのに役立ちます。

コード:

<?php

$foo = array(
  "somefield" => array("value1", "value2", "value3"),
  "anotherfield" => array("value1", "value2", "value3")
);

// create the $bar explicitely
$bar = array();

// use '{ }' to enclose foreach loops. Use descriptive var names
foreach($foo as $key => $values) {
    foreach($values as $index => $value) {
        // if the object has not already created in previous loop
        // then create it. Note, that you overwrote the object with a 
        // new one each loop. Therefore it only contained 'anotherfield'
        if(!isset($bar[$index])) {
            $bar[$index] = new StdClass();
        }
        $bar[$index]->$key = $value;
    }
}

var_dump($bar);
于 2013-02-05T14:35:53.800 に答える
1

試す

$bar = array();
foreach($foo as $n=>$ia)
   foreach($ia as $i=>$v)
      $bar[] = (object) array($n => $v);

これはあなたに与えるはずです:

$bar[0]->somefield = value1
$bar[1]->somefield = value2
$bar[2]->somefield = value3
$bar[3]->anotherfield = value1
$bar[4]->anotherfield = value2
$bar[5]->anotherfield = value3
于 2013-02-05T14:32:34.383 に答える