2010-09-20 57 views
1

我希望使用具有任意数量参数的函数来编辑数组。我到目前为止的代码是:使用func_get_args编辑数组

function setProperty() 
{ 
    $numargs = func_num_args(); 
    $arglist = func_get_args(); 
    $toedit = array(); 
    for ($i = 0; $i < $numargs-1; $i++) 
    { 
    $toedit[] = $arglist[$i]; 
    } 
    $array[] = $arglist[$numargs-1]; 
} 

的代码是我可以做以下的想法:

setProperty('array', '2nd-depth', '3rd', 'value1'); 
setProperty('array', 'something', 'x', 'value2'); 
setProperty('Another value','value3'); 

产生的以下数组中:

Array 
(
    [array] => Array 
     (
      [2nd-depth] => Array 
       (
        [3rd] => value1 
       ) 

      [something] => Array 
       (
        [x] => value2 
       ) 

     ) 

    [Another Value] => value3 
) 

问题我相信是用行:

$toedit[] = $arglist[$i]; 

这条线需要实现所需的功能是什么?

欢呼声,

+0

在随后的调用期间应该在哪里存储这个数组? – Gumbo 2010-09-20 14:42:00

回答

1

在存储新值之前,您需要走到目的地的路径。您可以通过参考做到这一点:

function setProperty() { 
    $numargs = func_num_args(); 
    if ($numargs < 2) return false; // not enough arguments 
    $arglist = func_get_args(); 

    // reference for array walk  
    $ar = &$array; 
    // walk the array to the destination 
    for ($i=0; $i<$numargs-1; $i++) { 
     $key = $arglist[$i]; 
     // create array if not already existing 
     if (!isset($ar[$key])) $ar[$key] = array(); 
     // update array reference 
     $ar = &$ar[$key]; 
    } 

    // add value 
    $ar = $arglist[$numargs-1]; 
} 

但是这个$array应该存储的问题仍然存在。

+0

呵呵,不要回避,我想知道为什么当我开始时答案不在那里:)很高兴知道我们在这种情况下认为几乎相同。 – Wrikken 2010-09-20 15:20:39

+0

$ array是类中的一个属性,完美工作,谢谢。 – Gazler 2010-09-20 15:37:36

-1

尝试使用foreach先循环遍历数组。然后为了处理孩子,你把它传递给一个能抓住一切的孩子功能。

我还推荐使用函数sizeof()来确定你的数组的大小,所以你会知道你的上限。

+0

-1对不起,我无法看到这对他有什么帮助。 – 2010-09-20 14:47:21

+0

我想你的意思是说,“任何方式”。 – Geekster 2010-09-20 16:18:07

1
class foo { 
private $storage; 
function setProperty() 
{ 
    $arglist = func_get_args(); 
    if(count($argslist) < 2) return false; 
    $target = &$this->storage; 
    while($current = array_shift($arglist)){ 
     if(count($arglist)==1){ 
      $target[$current] = array_shift($arglist); 
      break; 
     } 
     if(!isset($target[$current])) $target[$current] = array(); 
     $target = &$target[$current]; 
    } 
} 
}