PHP中变量的数组路径
因此,我编写了一个类,它可以解析XML文档并从中创建SQL查询,以根据设置更新或插入新行 由于脚本必须处理任意数量的嵌套块,因此我将所有值放入其中的数组将动态创建其路径,非常类似于以下示例:PHP中变量的数组路径,php,arrays,eval,dynamic-arrays,Php,Arrays,Eval,Dynamic Arrays,因此,我编写了一个类,它可以解析XML文档并从中创建SQL查询,以根据设置更新或插入新行 由于脚本必须处理任意数量的嵌套块,因此我将所有值放入其中的数组将动态创建其路径,非常类似于以下示例: $path = array('field1','field2'); $path = "['".implode("']['",$path)."']"; eval("\$array".$path."['value'] = 'test';"); 基本上,$path包含一个数组,显示我们当前在数组中的深度,如果
$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是一种糟糕的做法
第二次编辑
将实际代码更改为伪代码,因为这会引起很多误解。使用类似以下内容:
/**
* 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);
}
}
使用类似以下内容:
/**
* 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);
}
}
您可以使用array append运算符绕过整个计数器业务:
$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);
您可以使用array append运算符绕过整个计数器业务:
$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);
您可以将foreach与一起使用
简短、简单,而且比eval好得多。您可以使用foreach
简短、简单,而且比eval好得多。是的,很好。这看起来很像你做错了。您能显示输入XML和您想要实现的输出吗。你也许可以用迭代器来处理这个问题。哦,天哪。。。变量中的变量是错误的,但这只是。。啊哈(无意冒犯,只是开玩笑)这只是整个系统的一小部分,它工作得非常完美。我这样做的原因是,您需要能够设置一个表、字段名和多个其他选项(每个xml块)来定义数据需要发生什么。除了我不想使用eval之外,没有什么“出错”。可能是有用的:)尽管如此,许多工作完美的东西都是错误的。外科医生可以用勺子给你做手术,如果他能把勺子磨锋利的话,但这并不能减少手术的错误。因此,与其被冒犯,为什么不按要求去做,提供输入和期望的输出呢。毕竟,是你要求并想要一个替代上述可憎事物的选择,而不是我们;)是的,嗯。这看起来很像你做错了。您能显示输入XML和您想要实现的输出吗。你也许可以用迭代器来处理这个问题。哦,天哪。。。变量中的变量是错误的,但这只是。。啊哈(无意冒犯,只是开玩笑)这只是整个系统的一小部分,它工作得非常完美。我这样做的原因是,您需要能够设置一个表、字段名和多个其他选项(每个xml块)来定义数据需要发生什么。除了我不想使用eval之外,没有什么“出错”。可能是有用的:)尽管如此,许多工作完美的东西都是错误的。外科医生可以用勺子给你做手术,如果他能把勺子磨锋利的话,但这并不能减少手术的错误。因此,与其被冒犯,为什么不按要求去做,提供输入和期望的输出呢。毕竟,是你要求并想要一个替代上述可憎事物的选择,而不是我们;)如果我想连续做两次,$some\u array[]['name']='test'
,那么数组附加操作符不起作用,$some\u array['target']='test'
将留给我$some\u array[0]['name']='test'
和$some\u array[1]['target']='target'='target'>,或者通过使用current()
,可以绕过这个问题吗?@Kokos:不,每次都会创建一个新的。但是如果你像我一样做,通过分配一个新数组,你可以同时附加所有元素。=array()
肯定是我将开始使用的东西,我以前一直在寻找一个PHP数组速记,很像Actionscript中的=['field'=>'value']
,我从未想过在这种情况下使用正常语法。“路径业务”就是简单地用][
内爆一个数组,生成字段][field][field
,然后在前缀[
和后缀]
之后,我将其放入eval来生成一个数组。我认为如果我想连续做两个,$some\u array['name']='test'
然后,$some\u array[]['target']='test'
将留给我$some\u array[0]['name']='test'
和$some\u array[1]['target']='target'
,或者可以通过使用当前()
?@Kokos:不,每次都会创建一个新的数组。但是如果你像我一样做,通过分配一个新数组,你可以同时附加所有元素。=array()
肯定是我要开始使用的东西,我以前一直在寻找一个PHP数组速记,很像=['field'=>'value']
在Actionscript中,我从未想过在这样的情况下使用常规语法。“路径业务”只是用][
内爆一个数组,生成field][field][field
,然后在前缀[
和后缀]
我将其放入eval中以生成一个数组。这肯定会起作用,但我希望有一个速记,可以让我尽快完成这项工作