所以我写了一个类,它可以解析XML文档并从中创建SQL查询,以根据设置更新或插入新行。
因为脚本必须使用任意数量的嵌套块,所以我将所有值放入的数组的路径动态创建,如下例所示:
$path = array('field1','field2');
$path = "['".implode("']['",$path)."']";
eval("\$array".$path."['value'] = 'test';");
基本上$path
包含一个数组,显示我们当前在数组中的深度,如果$path
包含值main_table
和field
我想要设置{{} 1}}到$array['main_table']['field']['value']
正如您所看到的,我目前正在使用eval来执行此操作,这样可以正常工作。我只是想知道是否有办法在不使用eval的情况下执行此操作。
喜欢的东西
'test'
但事实上有效。
有什么建议吗?
修改
我正在寻找替代方案的原因是因为我认为eval是不好的做法。
第二次编辑
将实际代码更改为虚拟代码,因为它引起了很多误解。
答案 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更好。