2011-11-24 97 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

这很有效,除非最后的键不存在,在我的情况下它不会。所以我需要添加一个新的密钥和值对。我会怎么做? –