2013-06-28 44 views
3

我有PHP的阵列结构像这样unflatten数组在PHP中:如何使用点符号

array(
    'servicemanagement.scheduler.events.edit' => 'Edit', 
    'servicemanagement.scheduler.events.delete' => 'Delete', 
    'servicemanagement.scheduler.events' => 'Events', 
    'servicemanagement.scheduler' => 'Scheduler', 
    'servicemanagement.subscribers' => 'Subscribers', 
    'servicemanagement.subscribers.index' => 'Index', 
    'servicemanagement' => 'Service management', 
); 

而且我想转换是多维数组,如:

array(
    'servicemanagement' => array(
     'id' => 'servicemanagement', 
     'title' => 'Service Management', 
     'children' => array(
      'scheduler' => array(
       'id' => 'servicemanagement.scheduler', 
       'title' => 'Scheduler', 
       'children' => array(
        'events' => array(
         'id' => 'servicemanagement.scheduler.events', 
         'title' => 'Events', 
         'children' => array(
          'edit' => array(
           'id' => 'servicemanagement.scheduler.events.edit', 
           'title' => 'Edit', 
           'children' => array(), 
          ), 
          'delete' => array(
           'id' => 'servicemanagement.scheduler.events.delete', 
           'title' => 'Delete', 
           'children' => array(), 
          ), 
         ), 
        ), 
       ), 
      ), 
      'subscribers' => array(
       'id' => 'servicemanagement.subscribers', 
       'title' => 'Subscribers', 
       'children' => array(
        'index' => array(
         'id' => 'servicemanagement.subscribers.index', 
         'title' => 'Index', 
        ) 
       ), 
      ), 
     ), 
    ), 
); 

我也查了一些答案已经喜欢这一个: How to set a deep array in PHP

但似乎我不能设法清理对阵列的顶部和最后一个记录的书写'servicemanagement'删除所有以前的记录。

所使用的功能有

function setArray(&$array, $keys, $value) { 
    $keys = explode(".", $keys); 
    $current = &$array; 
    foreach($keys as $key) { 
     $current = &$current[$key]; 
    } 
    $current = $value; 
} 

,我已经找到另一项功能,但它没有做预期的结果是:

function unflatten($array,$prefix = '') 
{ 
    $result = array(); 
    foreach($array as $key=>$value) { 
     if (!empty($prefix)) { 
      $key = preg_replace('#^'.preg_quote($prefix).'#','',$key); 
     } 
     if (strpos($key,'.') !== false) { 
      parse_str('result['.str_replace('.','][',$key)."]=".$value); 
     } else { 
      $result[$key] = $value; 
     } 
    } 
    return $result; 
} 

它是用递归unflatten选项此数组自从结束格式对所有记录都是相同的。

有人可以给我这个小费吗?

+1

嗯,我认为你必须创建一个递归函数。 – vikingmaster

+0

我曾经回答过类似的问题,[看看这个](http://stackoverflow.com/a/15341125/2088851) – Voitcus

+0

@Voitcus它是类似的解决方案,在帖子中的第一个例子。 – kachar

回答

2

这不是最干净的解决方案,但它可以作为一个单一的功能

$your_array = array(
     'servicemanagement.scheduler.events.edit' => 'Edit', 
     'servicemanagement.scheduler.events.delete' => 'Delete', 
     'servicemanagement.scheduler.events' => 'Events', 
     'servicemanagement.scheduler' => 'Scheduler', 
     'servicemanagement.subscribers' => 'Subscribers', 
     'servicemanagement.subscribers.index' => 'Index', 
     'servicemanagement' => 'Service management', 
    ); 

    function expand($array, $level = 0) 
    { 
     $result = array(); 
     $next = $level + 1; 

     foreach($array as $key=>$value) { 
      $tree = explode('.', $key); 
      if(isset($tree[$level])) { 
       if(!isset($tree[$next])) { 
        $result[$tree[$level]]['id'] = $key; 
        $result[$tree[$level]]['title'] = $value; 
        if(!isset($result[$tree[$level]]['children'])) { 
         $result[$tree[$level]]['children'] = array(); 
        } 
       } else { 
        if(isset($result[$tree[$level]]['children'])) { 
         $result[$tree[$level]]['children'] = array_merge_recursive($result[$tree[$level]]['children'], expand(array($key => $value), $next)); 
        } else { 
         $result[$tree[$level]]['children'] = expand(array($key => $value), $next); 
        } 
       } 

      } 
     } 

     return $result; 

    } 
    var_export(expand($your_array)); 
+0

这很好,它完成了工作。我们可以替换'$ result [$ tree [$ level]] ['id'] = implode('。',array_slice($ tree,0,$ next));'带'$ result [$ tree [$ level] ] ['id'] = $ key;' – kachar

+0

我刚刚改变了这个答案,因为它消除了不必要的逻辑。 – Mike