Отображать содержимое массива в виде групп и подгрупп

У меня есть массив объектов, который выглядит примерно так:

$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'))
);

И мне нужно визуализировать эти данные, как показано ниже:

введите описание изображения здесь

Я не мог найти способ сделать это без возни sort_position, У кого-нибудь есть идеи, как мне добиться желаемой структуры?

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 */
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector