Php动态数组名

Php动态数组名,php,arrays,Php,Arrays,我试图通过动态名称来分配数组的值 $arr = array(); $path = 'arr'."['item']['abc']"; ${$path} = array( 'name'=>'somename', 'other'=>'...' ); 不是${$path}=>$arr['item']['abc'] 我还尝试了$$path,它的计算结果应该是$arr['item']['abc']但它们都不工作 已更新-> 我要做的是在数组中存储文件和文件夹

我试图通过动态名称来分配数组的值

$arr = array();

$path = 'arr'."['item']['abc']";

${$path} = array(
       'name'=>'somename',
       'other'=>'...'
);
不是
${$path}=>$arr['item']['abc']

我还尝试了
$$path
,它的计算结果应该是
$arr['item']['abc']但它们都不工作

已更新->


我要做的是在数组中存储文件和文件夹,我有这样的目录结构

(这是amazon aws s3对象键)

现在我要做的是将这些项存储在数组中

我把那些钥匙分成了这串

 ['aaa']['abc']
现在我想得到的是

[aaa]{
    [aaab]{}
    [abc]{
        [0]{one.png}
    }
    [aaab]{}
}

这只是为了说明

我认为你应该考虑使用引用而不是$$,像这样:

$arr = array();

$path = &$arr['item']['abc'];

$path[] = array(
       'name'=>'somename',
       'other'=>'...'
);

print_r($path);
编辑:基于作者提供的新详细信息的另一个选项:

让我们考虑索引存储在一个单独的数组中的情况,就像你所说的那样“动态”。item的索引总是相同的,我们就忽略它吧

$arr = array();

//Throwing out the 'item' index, leave only the important keys here
$loc_arr = array("abc","www","ccc");

foreach($loc_arr as $item){
    $arr['item'][$item] = array(
       'name'=>'somename',
       'other'=>'...'
    );
}

print_r($arr);
即使“item”元素不会一直具有相同的名称,也可以使用两个维度来指定正确的名称。添加一些递归函数,它将迭代该对象并相应地设置值。这是你的另一个选择

$loc_arr = array('item' => array('abc','www','ccc'), 'foo' => array('bar', 'bar2'));

与可变变量相比,一种不那么奇怪的方法是建立一个适当的结构:

<?php

$arr = array();

$loc_arr = array(
   'item' => array(
           'abc',
           'www',
           'ccc'),
   'other item' => array(
           'other index'
   )
);

foreach($loc_arr as $item => $scndLevel){
    foreach ( $scndLevel as $level) {
        $arr[$item][$level] = array(
           'name'=>'somename',
           'other'=>'...'
        );
    }
}

print_r($arr);
更新

<> P>在遍历目录而不是程序方法时应考虑递归函数:

伪代码:

dir = array();

function traverse(dir)
{
    foreach ( direntry as filename) {
        if ( filename is a sub directory ) {
            dir[filename] = array();
            traverse(dir[filename]);
        } else {
            dir[] = filename;
        }

}
dir['/'] = array();
traverse(dir['/']);

这只是给你一个想法和一个起点,这不是有效的代码。

参考你更新的codpad,有多种不使用变量的方法来编写它

这里有一个可能的选择:

<?php

$arr = array();

$loc_arr = array('item' => array('abc', 'www', 'ccc'));

foreach($loc_arr as $itemKey=>$items){
  foreach($items as $subitem) {
    $arr[$itemKey][$subitem] = array(
       'name'=>'somename',
       'other'=>'...'
    );
  }
}


这不是变量的工作方式。@Rizier123您能告诉我它是如何工作的吗?@Uchiha我只想将数组分配给
$arr['item']['abc']
但我不能让它成为staticRicherd,但是改用像$myItem=&$arr['item']['abc']这样的引用怎么样?然后你可以使用$item[]=array(…),我可以重写代码板,不轻易使用变量。有多种可能的解决方案。但是如果没有更多的上下文,很难知道我写的任何解决方案是否合适。ie在您的实际程序中,这些数组索引字符串是像在您的代码板中那样硬编码的,还是来自其他地方?另外,您是否总是将
['item']
作为代码板中的第一个数组下标,或者这种情况会改变吗?等等,是的。我会投票给任何提出合理建议的人,而不是那些疯狂的可变变量。
['item']['abc']
不是静态的,它像往常一样进行动态检查:如果
eval
是答案,你可能问错了问题。这是实际问题,我无法确定键数:(请检查更新的问题您遍历S3目录的方法可能值得考虑。这可能闻起来像是一项递归任务,而不是奇怪的算法。我尝试了递归,但amazon aws S3没有提供文件夹结构,我们得到的只是数组之类的东西,因此我无法在您可以的情况下应用递归。)n请参见,更精确地说,如何获得
['aaa']['abc']
:如果您可以构建一个类似
['aaa']['abc']的字符串
你也可以用它构建一个多维数组。如果是这样的话,你也可以轻松地立即在任意级别添加项目。更新的问题是:你首先是如何获得文件夹结构的?这是amazon aws s3 bucket listbucket返回的内容,正如你所知,amazon s3将所有东西都视为对象,因此你得到了一个对象结构已经存在?为什么不直接使用它呢?让我们在这里讨论一下,因为我正在与javascript文件浏览器集成,它需要json的关联数组,如所讨论的..而amazon aws s3对象是文件而不是php对象:)
dir = array();

function traverse(dir)
{
    foreach ( direntry as filename) {
        if ( filename is a sub directory ) {
            dir[filename] = array();
            traverse(dir[filename]);
        } else {
            dir[] = filename;
        }

}
dir['/'] = array();
traverse(dir['/']);
<?php

$arr = array();

$loc_arr = array('item' => array('abc', 'www', 'ccc'));

foreach($loc_arr as $itemKey=>$items){
  foreach($items as $subitem) {
    $arr[$itemKey][$subitem] = array(
       'name'=>'somename',
       'other'=>'...'
    );
  }
}