Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中变量的数组路径_Php_Arrays_Eval_Dynamic Arrays - Fatal编程技术网

PHP中变量的数组路径

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包含一个数组,显示我们当前在数组中的深度,如果

因此,我编写了一个类,它可以解析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是一种糟糕的做法

第二次编辑


将实际代码更改为伪代码,因为这会引起很多误解。

使用类似以下内容:

/**
 * 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中以生成一个数组。这肯定会起作用,但我希望有一个速记,可以让我尽快完成这项工作