2

PHP 配列から JSON でエンコードされたデータを作成しています。このデータは 2 レベルまたは 3 レベルの深さで、次のようになります。

[grandParent] => Array (
                       [parent] => Array (
                                         [child] => myValue 
                                      )
                    )

コードでネストされた配列を手動で作成するだけの方法では、「setOption」関数(後でエンコーディングを処理する)を使用して、いくつかの恐ろしいネストされた配列を入力する必要がありますが、次のようになります。

$option = setOption("grandParent",array("parent"=>array("child"=>"myValue")));

この例では、javascript と同様の表記法を使用して同じ結果を得られるようにしたかったのです。これは、多くのページで多くのオプションを設定する予定であり、特にネストされた配列に複数の配列が含まれている場合、上記はあまり読みにくいためです。キー - これを行うことができる方がはるかに理にかなっています:

$option = setOption("grandParent.parent.child","myValue");

「。」で文字列を分割することにより、多次元配列を作成できる方法を誰かが提案できますか? ネストされたオブジェクトに json_encode() できるようにするには?

( setOption 関数の目的は、すべてのオプションを 1 つの大きな入れ子になった PHP 配列にまとめてから、後ですべてを一度にエンコードすることです。そのため、解決策はそこにあります)

編集:コードでこれを行うことができることを認識しています:

$options['grandparent']['parent']['child'] = "myValue1";
$options['grandparent']['parent']['child2'] = "myValue2";
$options['grandparent']['parent']['child3'] = "myValue3";

どちらが簡単かもしれません。しかし、提案はまだ揺るぎないでしょう(私はそれをより広いオブジェクトの一部として使用しているので、その$obj->setOption(key,value);

4

4 に答える 4

9

サブアレイがまだ作成されていない場合は、サブアレイにデータを入力し、それに応じてキーを設定する必要があります(ここではコードパッド)。

function set_opt(&$array_ptr, $key, $value) {

  $keys = explode('.', $key);

  // extract the last key
  $last_key = array_pop($keys);

  // walk/build the array to the specified key
  while ($arr_key = array_shift($keys)) {
    if (!array_key_exists($arr_key, $array_ptr)) {
      $array_ptr[$arr_key] = array();
    }
    $array_ptr = &$array_ptr[$arr_key];
  }

  // set the final key
  $array_ptr[$last_key] = $value;
}

そのように呼んでください:

$opt_array = array();
$key = 'grandParent.parent.child';

set_opt($opt_array, $key, 'foobar');

print_r($opt_array);

編集内容に合わせてarray、クラス内で使用するようにこれを調整することをお勧めします...しかし、うまくいけば、これが開始の場所を提供します!

于 2012-05-09T15:48:34.183 に答える
0

受け入れられた回答の OO バージョン (http://codepad.org/t7KdNMwV)

  $object = new myClass();
  $object->setOption("mySetting.mySettingsChild.mySettingsGrandChild","foobar");
  echo "<pre>".print_r($object->options,true)."</pre>";

  class myClass {

     function __construct() {
        $this->setOption("grandparent.parent.child","someDefault");
     }

    function _setOption(&$array_ptr, $key, $value) {

        $keys = explode('.', $key);

        $last_key = array_pop($keys);

        while ($arr_key = array_shift($keys)) {
            if (!array_key_exists($arr_key, $array_ptr)) {
                $array_ptr[$arr_key] = array();
            }
            $array_ptr = &$array_ptr[$arr_key];
        }

        $array_ptr[$last_key] = $value;
    }

    function setOption($key,$value) {

        if (!isset($this->options)) {
            $this->options = array();
        }

        $this->_setOption($this->options, $key, $value);
        return true;                        
    }

  }
于 2012-05-09T16:19:05.150 に答える
0

@rjzソリューションは私を助けてくれました。配列に格納されたキーのセットから配列を作成する必要がありましたが、数値インデックスに関してはうまくいきませんでした。配列インデックスのセットからネストされた配列を作成する必要がある場合は、次のように配列に格納します。

$keys = array(
    'variable_data',
    '0',
    'var_type'
);

ここで解決策を見つけることができます:キーのセットからの Php 配列

于 2012-05-26T11:28:40.270 に答える
0

どう$option = setOption("grandParent", { parent:{ child:"myValue" } });ですか?

以前に設定されていない場合、実行するとエラー$options['grandparent']['parent']['child']が発生します$options['grandparent']['parent']

于 2012-05-09T15:44:20.393 に答える