2017-02-04 7 views
0

ここに私の収集した配列です。親idの助けを借りてサブ配列を作成する方法

$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

もう1つの説明。このリストにはさらに多くのサブリストが含まれています。ネストされた配列の任意の組み合わせを作成するネストされた関数を呼び出すのを手伝ってください。 – 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 ESに参加することができます。

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

@Anant yeah、fixed。 –

+0

@u_mulder。どちらも私の期待に近い近い結果を与えてくれました。しかし、私は配列のキーに6と9の配列キーを必要としません。私は、配列キーで使用されているIDを意味します。あなたは私がそれを修正するのを助けることができますか? ?配列の中にあるIDは使用しないでください。 – Kvvaradha

関連する問題