2017-02-04 2 views
0

Вот мой собранный массив.Как создать вспомогательные массивы с помощью родительского идентификатора

$raw_ar = Array ( 
0 => Array ('ID' => 6, 'pageTitle' => 'First', 'pageContent' => 'http://localhost/cms/1', 'parentID' => 0), 
1 => Array ('ID' => 7, 'pageTitle' => 'Second', 'pageContent' => 'http://localhost/cms/2', 'parentID' => 6), 
2 => Array ('ID' => 8, 'pageTitle' => 'Third', 'pageContent' => 'http://localhost/cms/3', 'parentID' => 6) , 
3 => Array ('ID' => 9, 'pageTitle' => 'Four', 'pageContent' => 'http://localhost/cms/4', 'parentID' => 0) 
) ; 

И мой результат должен быть, как этот

$final_ar = array(

    0 => array ('ID' => 6, 'pageTitle' => 'First', 'pageContent' => 'http://localhost/cms/1', 'parentID' => 0 , 

    'sub_items' => array( 
     0 => array('ID' => 7, 'pageTitle' =>'second', 'pageContent' => 'http://localhost/cms/2', 'parentID' => 6), 
     1 => array('ID' => 8, 'pageTitle' => 'Third', 'pageContent' => 'http://localhost/cms/3', 'parentID' => 6), 
    ) 
), 
    1 => array('ID' => 9, 'pageTitle' => 'Four', 'pageContent' => 'http://localhost/cms/4', 'parentID' => 0) 
); 

И вот мой код

$final_ar = array(); 

foreach ($raw_ar as $value) { 
if($value['parentID'] ==0){ 
    $final_ar[] = $value; 
} 
else{ 
    $pID = $value['parentID']; 
    foreach ($final_ar as $value1) { 
     //echo $value1['ID'].'-'.$pID; 
     if($value1['ID'] == $pID){ 
      //if(isset($value1['sub_items'])){ 
       $value1['sub_items'][] = $value; 
      //}else 
       //$value1['sub_items'] = $value; 
     } 
     $temp_ar[] = $value1; 
    } 
    $exist = 0; 
    foreach ($final_ar as $key => $val) { 
     # code... 
     if($val['ID'] == $temp_ar['ID']){ 
      unset($final_ar[$key]); 
      $final_ar[$key] = $temp_ar; 
      $exist =1; 
      break; 
     } 
    } 
    if($exist == 0) 
    $final_arr[] = $temp_ar; 
    //$parent_key = array_column($raw_ar,'ID', 'parentID');  
} 
} 
print_r($final_arr); 

И я пытался кодировать его с sub_items. Но он помогает создавать массив. Но я не знаю, как удалить существующий массив после его модификации. Это дает такой результат.

Array ([0] => Array ([0] => Array ([ID] => 6 [pageTitle] => First [pageContent] => http://localhost/cms/1 [parentID] => 0 [sub_items] => Array ([0] => Array ([ID] => 7 [pageTitle] => Second [pageContent] => http://localhost/cms/2 [parentID] => 6)))) [1] => Array ([0] => Array ([ID] => 6 [pageTitle] => First [pageContent] => http://localhost/cms/1 [parentID] => 0 [sub_items] => Array ([0] => Array ([ID] => 7 [pageTitle] => Second [pageContent] => http://localhost/cms/2 [parentID] => 6))) [1] => Array ([ID] => 6 [pageTitle] => First [pageContent] => http://localhost/cms/1 [parentID] => 0 [sub_items] => Array ([0] => Array ([ID] => 8 [pageTitle] => Third [pageContent] => http://localhost/cms/3 [parentID] => 6))))) 

ответ

1

Попробуйте следующее:

function formatArray($nonFormattedArray) { 

    $formattedArray = []; 
    $subItems = []; 

    foreach ($nonFormattedArray as $item) { 
     $pid = $item['parentID']; 

     if ($pid != 0) { 
      if (isset($subItems[$pid])) 
       $subItems[$pid][] = $item; 
      else 
       $subItems[$pid] = [$item]; 
     } else 
      $formattedArray[] = $item; 
    } 

    foreach ($formattedArray as $key => $parent) { 
     resolveChild($formattedArray[$key], $subItems); 
    } 

    return $formattedArray; 
} 

function resolveChild(&$parent, &$subItems) { 
    //return if no child 
    if (!isset($subItems[$parent['ID']])) 
     return $parent; 

    foreach ($subItems[$parent['ID']] as $key => $child) { 
     if (isset($parent['sub_items'])) 
      $parent['sub_items'][] = resolveChild($subItems[$parent['ID']][$key], $subItems); 
     else 
      $parent['sub_items'] = [resolveChild($subItems[$parent['ID']][$key], $subItems)]; 
    } 

    return $parent; 
} 

Теперь, formatArray ($ nonFormattedArray) должен вернуть желаемый ответ.

Это будет независимо от порядка ваших родительских и дочерних элементов и уменьшит общее количество итераций и время выполнения.

Это приведет к созданию массива так же глубоко, как наследование данных.

Обратите внимание, что время выполнения увеличивается с увеличением уровня наследования.

+0

Спасибо, ты это сделал. – Kvvaradha

+0

еще один уточнение. этот список может иметь больше подписок. Можете ли вы помочь мне вызвать вложенные функции для создания любой комбинации вложенных массивов ?. – Kvvaradha

+0

Вы имеете в виду, что подпункты вашего массива также могут содержать подпозиции? –

1

Так много кода у вас здесь.

Вот моя версия:

foreach ($raw_ar as $value) { 
    if ($value['parentID'] == 0) { 
     $final_ar[$value['ID']] = $value; 
    } 
} 

foreach ($raw_ar as $value) { 
    $parent_id = $value['parentID']; 
    if (0 < $parent_id) { 
     if (!isset($final_ar[$parent_id]['sub_items'])) { 
      $final_ar[$parent_id]['sub_items'] = []; 
     } 

     $final_ar[$parent_id]['sub_items'][] = $value; 
    } 
} 

$final_ar = array_values($final_ar); // if you need 0-indexed array 

Если вы 100% уверены, что родительские элементы в массиве прийти до детей из них - вы можете присоединиться как foreach эс в одно:

foreach ($raw_ar as $value) { 
    $parent_id = $value['parentID']; 
    if ($parent_id == 0) { 
     $final_ar[$value['ID']] = $value; 
    } else { 
     if (!isset($final_ar[$parent_id]['sub_items'])) { 
      $final_ar[$parent_id]['sub_items'] = []; 
     } 

     $final_ar[$parent_id]['sub_items'][] = $value; 
    } 
} 

$final_ar = array_values($final_ar); // if you need 0-indexed array 
+0

https://eval.in/730324 –

+1

@ Обязательное да, исправлено. –

+0

@u_mulder. Оба дали некоторый расширенный результат, близкий к моему ожидаемому. Но я не хочу, чтобы ключ массива 6 и 9 на ключе массива. Я имею в виду идентификатор, который использовался в ключе массива. Можете ли вы помочь мне исправить это. ? Это не должно использоваться идентификатор, который находится внутри массива. – Kvvaradha

Смежные вопросы