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'=>'...'
);
}
}