0

所以我编写了一个类,它可以解析 XML 文档并从中创建 SQL 查询,以根据设置更新或插入新行。

因为脚本必须处理任意数量的嵌套块,所以我将所有值放入的数组的路径是动态创建的,类似于以下示例:

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

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

基本上$path包含一个数组,显示我们当前在数组中的深度,如果$path包含例如值main_table并且field我想设置$array['main_table']['field']['value']'test'

如您所见,我目前正在使用 eval 来执行此操作,并且效果很好。我只是想知道是否有办法在不使用 eval 的情况下做到这一点。

类似的 $array{$path}['value'] = 'test';东西,但实际上确实有效的东西。

有什么建议么?

编辑

我正在寻找替代方案的原因是因为我认为 eval 是不好的做法。

第二次编辑

将实际代码更改为虚拟代码,因为它引起了很多误解。

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 回答
-1

您可以使用带有变量 variables的 foreach 。

// assuming a base called $array, and the path as in your example:
$path = array('field1','field2');

$$path = $array;
foreach ($path as $v) $$path = $$path[$v];
$$path['value'] = 'test';

简短,简单,比 eval 好得多。

于 2018-05-05T21:29:50.987 回答