2015-10-04 57 views
1

我試圖在一個小時內工作一小時(可能是我的星期日大腦),我在另一個網站上遇到了這個問題,我放棄了。現在的問題是:如果有一個功能foo將func_get_args連接成多維數組

function foo(){} 

的功能可以被稱爲(參數可以是>= 2,其中最後總是值和先前是陣列的一部分)。

所以調用該函數爲:

foo('arg1', 'value'); 

應導致:

$array['arg1'] = 'value'; 

同樣的,如果有超過1個論點:

foo('arg1', 'argx', 'argz', 'value'); 

應該產生:

$array['arg1']['argx']['argz'] = 'value'; 

這是我sad attempt

function foo() 
{ 
    $items = func_get_args(); 
    $value = array_pop($items); 
    $array = array_shift($items); 

    // Construct first element 
    $array = array($array => array()); 

    foreach ($items as $el) { 
     insert_last($array, $value); 
    } 

    return $array; 
} 

function insert_last(&$array, $value) 
{ 
    $copy = $array; 
    while (true) { 
     $keys = array_keys($copy); 
     $last = $copy[$keys[count($copy)-1]]; 
     var_dump($last); 
     if (empty($last)) { 
      $last = $value; 
      break; 
     } 
     $copy = $last; 
    } 
    var_dump($array, $copy); 
} 

相當肯定有可能是說我不能在此刻想到的簡單的解決方案。謝謝!

回答

4
function foo() 
{ 
    $items = func_get_args(); 
    $value = array_pop($items); 
    $array = []; 
    $arrayPtr = &$array; 

    foreach ($items as $element) { 
     $arrayPtr[$element] = null; 
     $arrayPtr = &$arrayPtr[$element]; 
    } 
    $arrayPtr[$element] = $value; 

    return $array; 
} 

var_dump(foo('arg1', 'argx', 'argz', 'value')); 

Demo

+0

偉大的思想!我只需要更新指針,只在最後添加值:'$ arrayPtr [$ element] = $ value;' - >'$ arrayPtr = $ value;'以避免重複的最後一個條目。 –

2

通過使用call_user_func_array()

<?php 
function foo() { 
    $items = func_get_args(); 
    if (1==count($items)) { 
     return array_shift($items); 
    } 
    else { 
     $key = array_shift($items); 
     return array($key=>call_user_func_array('foo', $items)); 
    } 
} 

var_dump(foo('arg1', 'argx', 'argz', 'value')); 

編輯遞歸:同樣的事情,沒有func_get_args(),但使用variadic function

<?php 
function foo(...$items) { 
    if (1==count($items)) { 
     return array_shift($items); 
    } 
    else { 
     $key = array_shift($items); 
     return array($key=>call_user_func_array('foo', $items)); 
    } 
} 

var_dump(foo('arg1', 'argx', 'argz', 'value')); 
+0

不錯,我總是喜歡遞歸解決方案的小任務,使事情變得更加清潔! –

+0

由於馬克擊敗了我,我不得不提出另一個解決方案;-)但上次我檢查'call_user_func_array'是一個相對昂貴的操作。由於這是一個小函數,因此參考的範圍受到限制,我會在此處使用參考而不是遞歸。 – VolkerK

1

什麼像

function foo() 
{ 
    $args = func_get_args(); 

    $items = array_pop($args); 
    foreach (array_reverse($args) as $item) { 
     $items = array($item => $items); 
    } 

    return $items; 
} 

var_dump(foo('arg1', 'argx', 'argz', 'value')); 

Demo