2011-11-24 63 views
6

關於數組這個問題我剛纔問的多維數組設定值:Searching multi-dimensional array's keys using a another array使用按鍵

我想辦法設置在多維數組的值(最多6級深),使用包含要使用的密鑰的單獨數組。

例如

$keys = Array ('A', 'A2', 'A22', 'A221'); 
$cats[A][A2][A22][A221] = $val; 

我試着寫了一個笨拙的開關,有點成功......有沒有更好的解決方案?

function set_catid(&$cats, $keys, $val) { 
    switch (count($keys)) { 
     case 1: $cats[$keys[0]]=$val; break; 
     case 2: $cats[$keys[0]][$keys[1]]=$val; break; 
     case 3: $cats[$keys[0]][$keys[1]][$keys[2]]=$val; break; 
     etc... 
    } 
} 
+0

你可以[使用引用(http://stackoverflow.com/questions/6088115/transform-flat-array-into-a-hierarchical-multi-dimensional -array/6088147#6088147)以任意數量的鍵遍歷數組。 – mario

回答

1

試試這個:

function set_catid(&$cats, $keys, $val) { 
    $ref =& $cats; 
    foreach ($keys as $key) { 
    if (!is_array($ref[$key])) { 
     $ref[$key] = array(); 
    } 
    $ref =& $ref[$key]; 
    } 
    $ref = $val; 
} 
+0

這很有效,除非最後的鍵不存在,在我的情況下它不會。我在$ ref =&$ ref [$ key]上得到錯誤「致命錯誤:無法創建對字符串偏移量或重載對象的引用」;我將如何解決這個問題? –

+0

很奇怪。這對我來說很好。 (從一個完全空的數組$ cats開始)..必須是因爲「A22」(最後一個鍵之前的鍵)存在不同於數組的數組。例如串?在這種情況下用is_array()替換isset()將有所幫助 - 但是您將通過用另一個數組替換它而丟失「A22」中的字符串..您可以在使用此函數之前發佈print_r($ cats)的輸出嗎? – Kaii

+0

我做了我在示例中建議的更改,再次嘗試 – Kaii

1
function insertValueByPath($array, $path, $value) { 
    $current = &$array; 
    foreach (explode('/', $path) as $part) { 
     $current = &$current[$part]; 
    } 
    $current = $value; 

    return $array; 
} 

$array = insertValueByPath($array, 'A/B/C', 'D'); 
// => $array['A']['B']['C'] = 'D'; 

可以很明顯的也只是刪除了explode呼叫使用數組$path

0

您應該使用參考。

在我們這裏,我們正在從關鍵轉向關鍵。 Var $ temp是對數組$ cat的當前元素的引用。最後,temp是我們需要的元素。

<?php 

    function set_catid(&$cats, $keys, $val) { 
     $temp = &$cats; 
     foreach($keys as $key) { 
      $temp = &$temp[$key]; 
     } 

     $temp = $val; 
    } 

    $cats = array(); 
    $keys = Array ('A', 'A2', 'A22', 'A221'); 
    set_catid($cats, $keys, 'test'); 
    print_r($cats); 
    ?> 
+0

這很有效,除非最後的鍵不存在,在我的情況下它不會。所以我需要添加一個新的密鑰和值對。我會怎麼做? –