将数组内容显示为组和子组

时间:2017-11-02 16:51:15

标签: php html

我有一个类似于此的对象数组:

$data = array(
    array('id' => 31, sort_position=>'1', 'code' => 'no_channels', 'title' => 'No of channels', 'group_title'=> 'Popular', 'sub_group_title'=> NULL, values=> array('9.5', '7.5', '5.5')),
    array('id' => 32, sort_position=>'2', 'code' => 'hdr10', 'title' => 'HDR 10', 'group_title'=> 'Popular', 'sub_group_title'=> 'HRD', values=> array('yes', 'No')),
    array('id' => 36, sort_position=>'3', 'code' => 'dolby_vision', 'title' => 'Dolby Vision', 'group_title'=> 'Popular', 'sub_group_title'=> 'HRD', values=> array('yes', 'No')),
    array('id' => 28, sort_position=>'4', 'code' => 'hlg', 'title' => 'HLG', 'group_title'=> 'Popular', 'sub_group_title'=> 'HRD', values=> array('yes', 'No')),
    array('id' => 29, sort_position=>'5', 'code' => 'up_scaling', 'title' => 'Up scaling', 'group_title'=> 'Popular', 'sub_group_title'=> NULL, values=> array('yes', 'No')),
    array('id' => 33, sort_position=>'6', 'code' => 'release_year', 'title' => 'Release Year', 'group_title'=> 'Audio', 'sub_group_title'=> NULL, values=> array('2013', '2014', '2015')),
    array('id' => 34, sort_position=>'7', 'code' => '3d_audio', 'title' => '3D Audio', 'group_title'=> 'Audio', 'sub_group_title'=> NULL, values=> array('yes', 'No')),
    array('id' => 39, sort_position=>'8', 'code' => 'heos', 'title' => 'Heos', 'group_title'=> 'Audio', 'sub_group_title'=> 'HDMI', values=> array('yes', 'No')),
    array('id' => 40, sort_position=>'9', 'code' => 'hdmi_inputs', 'title' => 'No. of HDMI Inputs', 'group_title'=> 'Audio', 'sub_group_title'=> 'HDMI', values=> array('2', '3', '4')),
    array('id' => 41, sort_position=>'10', 'code' => 'hdmi_outputs', 'title' => 'No. of HDMI Outputs', 'group_title'=> 'Audio', 'sub_group_title'=> NULL, values=> array('2', '3', '4'))
);

我需要渲染这些数据,如下图所示:

enter image description here

我找不到像这样渲染的方法而不会弄乱sort_position。有谁知道我怎样才能达到理想的结构?

1 个答案:

答案 0 :(得分:0)

php中的以下可能解决方案使用json_encode()后跟json_decode()来更轻松地访问键值对。为原始数据中的每个所需键创建一个唯一值数组,然后使用这些数组中的每一个循环数据,同时确保不存在不必要的重复。 sort_position由读取值的顺序自动处理,这意味着事先在sort_position上对原始数据进行排序。解决方案是:

$original_data = array(
    array('id' => 31, sort_position=>'1', 'code' => 'no_channels', 'title' => 'No of channels', 'group_title'=> 'Popular', 'sub_group_title'=> NULL, values=> array('9.5', '7.5', '5.5')),
    array('id' => 32, sort_position=>'2', 'code' => 'hdr10', 'title' => 'HDR 10', 'group_title'=> 'Popular', 'sub_group_title'=> 'HRD', values=> array('yes', 'No')),
    array('id' => 36, sort_position=>'3', 'code' => 'dolby_vision', 'title' => 'Dolby Vision', 'group_title'=> 'Popular', 'sub_group_title'=> 'HRD', values=> array('yes', 'No')),
    array('id' => 28, sort_position=>'4', 'code' => 'hlg', 'title' => 'HLG', 'group_title'=> 'Popular', 'sub_group_title'=> 'HRD', values=> array('yes', 'No')),
    array('id' => 29, sort_position=>'5', 'code' => 'up_scaling', 'title' => 'Up scaling', 'group_title'=> 'Popular', 'sub_group_title'=> NULL, values=> array('yes', 'No')),
    array('id' => 33, sort_position=>'6', 'code' => 'release_year', 'title' => 'Release Year', 'group_title'=> 'Audio', 'sub_group_title'=> NULL, values=> array('2013', '2014', '2015')),
    array('id' => 34, sort_position=>'7', 'code' => '3d_audio', 'title' => '3D Audio', 'group_title'=> 'Audio', 'sub_group_title'=> NULL, values=> array('yes', 'No')),
    array('id' => 39, sort_position=>'8', 'code' => 'heos', 'title' => 'Heos', 'group_title'=> 'Audio', 'sub_group_title'=> 'HDMI', values=> array('yes', 'No')),
    array('id' => 40, sort_position=>'9', 'code' => 'hdmi_inputs', 'title' => 'No. of HDMI Inputs', 'group_title'=> 'Audio', 'sub_group_title'=> 'HDMI', values=> array('2', '3', '4')),
    array('id' => 41, sort_position=>'10', 'code' => 'hdmi_outputs', 'title' => 'No. of HDMI Outputs', 'group_title'=> 'Audio', 'sub_group_title'=> NULL, values=> array('2', '3', '4'))
);

$json = json_encode($original_data);
$data = json_decode($json);

/* store unique values of the variables in aarrays */
$arr_group_titles = []; $arr_titles = [];$arr_sub_group_titles = [];$arr_codes = [];$arr_values = [];
foreach($data as $v){ 
if(!in_array($v->group_title, $arr_group_titles)){ $arr_group_titles[] = $v->group_title;}
if(!in_array($v->title, $arr_titles)){ $arr_titles[] = $v->title;}
if(!in_array($v->sub_group_title, $arr_sub_group_titles)){ $arr_sub_group_titles[] = $v->sub_group_title; }
if(!in_array($v->code, $arr_codes)){ $arr_code[] = $v->code;}
if(!in_array($v->value, $arr_values)){ $arr_values[] = $v->value;}}

/* Will use $arr_sub_group_taken to remove sub_group_title duplication: */
$arr_sub_group_taken = [];

/* Loop through the unique arrays with the data */
foreach($arr_group_titles as $group_title){
echo '<br/><strong>'.$group_title.' (parent group)</strong><br/>';
foreach($arr_titles as $title){
foreach($data as $v){ if($v->group_title == $group_title && $v->title == $title){ echo '--'.$title.'<br/>';
foreach($arr_sub_group_titles as $sub_group_title){
if(!in_array($sub_group_title,$arr_sub_group_taken) && !empty($sub_group_title) && $v->group_title == $group_title && $v->title == $title && $v->sub_group_title == $sub_group_title ){
echo '&emsp;'.$sub_group_title.' (sub group)<br/>'; $arr_sub_group_taken[] = $sub_group_title;}
if($v->sub_group_title == $sub_group_title){
 foreach($v->values as $u){ echo '&emsp;&emsp;'.$u.'<br/>'; }
}}}}}}

输出结果为:

 /*
   Popular (parent group)
    --No of channels
      9.5
      7.5
      5.5
    --HDR 10
     HRD (sub group)
      yes
      No
    --Dolby Vision
      yes
      No
    --HLG
      yes
      No
    --Up scaling
      yes
      No

    Audio (parent group)
    --Release Year
      2013
      2014
      2015
    --3D Audio
      yes
      No
    --Heos
     HDMI (sub group)
      yes
      No
    --No. of HDMI Inputs
      2
      3
      4
    --No. of HDMI Outputs
      2
      3
      4 */