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条)

报告相同问题?

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能