我正在尝试按动态名称分配数组值我正在尝试跟随
$arr = array();
$path = 'arr'."['item']['abc']";
${$path} = array(
'name'=>'somename',
'other'=>'...'
);
不是${$path} => $arr['item']['abc'];
我也尝试了$$path
,评估为$arr['item']['abc'];
,但没有一个工作
http://codepad.viper-7.com/Dc8Jei
已更新 - > http://codepad.viper-7.com/k4sIgJ
我要做的是在数组中存储文件和文件夹我有这样的目录结构
(这是亚马逊aws s3对象键)
aaa/aaab/
aaa/a.png
aaa/abc/one.png
abb/a/
abb/some/
abb/some/ac.png
现在我要做的是将这些项目存储在数组
中我将这些键分解为此字符串,如
['aaa']['abc']
现在我想要的是
[aaa]{
[aaab]{}
[abc]{
[0]{one.png}
}
[aaab]{}
}
仅用于说明
答案 0 :(得分:3)
参考你更新的密码板,有多种方法可以在不使用变量的情况下编写它。
这是一个可能的选择:
<?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'=>'...'
);
}
}
正如我在评论中所提到的,很难知道这个特定解决方案对您的特定用例的适用程度,但我认为它应该清楚地证明不应该有任何特定的用例。在这种情况下需要变量变量。
变量变量应该与eval()
非常相似:尽可能避免使用它们。如果你发现自己想要使用它们,那么你可能会从错误的角度接近事物。它们的存在是因为它们在某些偶然情况下可能有用,但这些情况非常罕见。十多年来,我一直在编写PHP作为专业开发人员,我记不清上次即将到来需要使用它们了。
答案 1 :(得分:2)
我认为你应该考虑使用引用而不是$$,如下所示:
$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'元素始终不具有相同的名称 - 您也可以使用2个维度来指定正确的元素。添加一些递归函数,它将遍历事物并相应地设置值。只是另一种选择。
$loc_arr = array('item' => array('abc','www','ccc'), 'foo' => array('bar', 'bar2'));
答案 2 :(得分:0)
比变量变量更少的方法是建立一个合适的结构:
<?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);
打印:
Array
(
[item] => Array
(
[abc] => Array
(
[name] => somename
[other] => ...
)
[www] => Array
(
[name] => somename
[other] => ...
)
[ccc] => Array
(
[name] => somename
[other] => ...
)
)
[other item] => Array
(
[other index] => Array
(
[name] => somename
[other] => ...
)
)
)
<强>更新强>:
在遍历目录而不是程序方法时,您应该考虑递归函数:
伪代码:
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['/']);
这只是为了给你一个想法和一个起点,这不是有效的代码。