PHP中变量的数组路径

时间:2011-04-28 15:13:51

标签: php arrays eval dynamic-arrays

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

因为脚本必须使用任意数量的嵌套块,所以我将所有值放入的数组的路径动态创建,如下例所示:

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

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

基本上$path包含一个数组,显示我们当前在数组中的深度,如果$path包含值main_tablefield我想要设置{{} 1}}到$array['main_table']['field']['value']

正如您所看到的,我目前正在使用eval来执行此操作,这样可以正常工作。我只是想知道是否有办法在不使用eval的情况下执行此操作。

喜欢的东西 'test'但事实上有效。

有什么建议吗?

修改

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

第二次编辑

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

3 个答案:

答案 0 :(得分:3)

使用类似的东西:

/**
 * 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);
  }

}

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以将foreach与variable variables一起使用。

// 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更好。