Php动态数组名称

时间:2015-10-16 11:26:58

标签: php arrays

我正在尝试按动态名称分配数组值我正在尝试跟随

$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]{}
}

仅用于说明

3 个答案:

答案 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['/']);

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