doushaizhen1244 2016-08-04 04:26
浏览 60
已采纳

在PHP中创建动态分层数组

I have this general data structure:

$levels = array('country', 'state', 'city', 'location');

I have data that looks like this:

$locations = array(
  1 => array('country'=>'USA', 'state'=>'New York', 'city'=>'NYC', 'location'=>'Central Park', 'count'=>123),
  2 => array('country'=>'Germany', ... )
);

I want to create hierarchical arrays such as

$hierarchy = array(
  'USA' => array(
    'New York' => array(
      'NYC' => array(
        'Central Park' => 123,
      ),
    ),
  ),
  'Germany' => array(...),
);

Generally I would just create it like this:

$final = array();
foreach ($locations as $L) {
    $final[$L['country']][$L['state']][$L['city']][$L['location']] = $L['count'];
}

However, it turns out that the initial array $levels is dynamic and can change in values and length So I cannot hard-code the levels into that last line, and I do not know how many elements there are. So the $levels array might look like this:

$levels = array('country', 'state');

Or

$levels = array('country', 'state', 'location');

The values will always exist in the data to be processed, but there might be more elements in the processed data than in the levels array. I want the final array to only contain the values that are in the $levels array, no matter what additional values are in the original data.

How can I use the array $levels as a guidance to dynamically create the $final array?

I thought I could just build the string $final[$L['country']][$L['state']][$L['city']][$L['location']] with implode() and then run eval() on it, but is there are a better way?

  • 写回答

5条回答 默认 最新

  • drg5577 2016-08-04 05:14
    关注

    Here's my implementation. You can try it out here:

    $locations = array(
      1 => array('country'=>'USA', 'state'=>'New York', 'city'=>'NYC', 'location'=>'Central Park', 'count'=>123),
      2 => array('country'=>'Germany', 'state'=>'Blah', 'city'=>'NY', 'location'=>'Testing', 'count'=>54),
    );
    
    $hierarchy = array();
    
    $levels = array_reverse(
        array('country', 'state', 'city', 'location')
    );
    
    $lastLevel = 'count';
    
    
    foreach ( $locations as $L )
    {
        $array = $L[$lastLevel];
    
        foreach ( $levels as $level )
        {
            $array = array($L[$level] => $array);
        }
    
        $hierarchy = array_merge_recursive($hierarchy, $array);
    }
    
    print_r($hierarchy);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?