0

そこで、XML ドキュメントを解析し、そこから SQL クエリを作成して、設定に応じて新しい行を更新または挿入できるクラスを作成しました。

スクリプトはネストされたブロックの量に関係なく動作する必要があるため、すべての値を入れている配列のパスは、次の例のように動的に作成されます。

$path = array('field1','field2');
$path = "['".implode("']['",$path)."']";

eval("\$array".$path."['value'] = 'test';");

基本的に、たとえば値が含まれていて、設定したい場合$path、現在の配列の深さを示す配列が含まれています$pathmain_tablefield$array['main_table']['field']['value']'test'

ご覧のとおり、現在これを行うために eval を使用していますが、これは正常に機能します。evalを使わずにこれを行う方法があるかどうか疑問に思っています。

のような $array{$path}['value'] = 'test';ものですが、実際に機能するものです。

助言がありますか?

編集

私が代替手段を探している理由は、eval は悪い習慣だと思うからです。

2回目の編集

多くの誤解を招いていたため、実際のコードをダミー コードに変更しました。

4

3 に答える 3

4

次のようなものを使用します。

/**
 * Sets an element of a multidimensional array from an array containing
 * the keys for each dimension.
 * 
 * @param array &$array The array to manipulate
 * @param array $path An array containing keys for each dimension
 * @param mixed $value The value that is assigned to the element
 */
function set_recursive(&$array, $path, $value)
{
  $key = array_shift($path);
  if (empty($path)) {
    $array[$key] = $value;
  } else {
    if (!isset($array[$key]) || !is_array($array[$key])) {
      $array[$key] = array();
    }
    set_recursive($array[$key], $path, $value);
  }
}
于 2011-04-28T15:24:15.057 に答える
1

配列追加演算子を使用すると、カウンタービジネス全体をバイパスできます。

$some_array[] = 1; // pushes '1' onto the end of the array

パスビジネス全体に関しては、基本的にはxmlドキュメントを通るxpathのようなルートの奇妙な表現だと思います...その文字列を配列キー自体として単純に使用できない理由はありますか?

$this->BLOCKS['/path/to/the/node/you're/working/on][] = array('name' => $name, 'target' => $target);
于 2011-04-28T15:25:30.547 に答える