2016-07-03 17 views
1

カテゴリの配列を並べ替えることをお勧めします。ルートカテゴリは、子カテゴリの前に新しい配列で最初に表示する必要があります。ルートカテゴリ別にカテゴリの並べ替えを並べ替え

例データ:私が達成したい

$data = [ 
    ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ], 
    ['id' => '4', 'name' => 'def', 'parent_id' => '5' ], 
    ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ], 
    ['id' => '5', 'name' => 'zst', 'parent_id' => '1' ], 
    ['id' => '2', 'name' => 'klm', 'parent_id' => '1' ], 
]; 

が出力:

$output = [ 
    '1' => ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ], 
    '5' => ['id' => '5', 'name' => 'zst', 'parent_id' => '1' ], 
    '4' => ['id' => '4', 'name' => 'def', 'parent_id' => '5' ], 
    '2' => ['id' => '2', 'name' => 'klm', 'parent_id' => '1' ], 
    '3' => ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ], 
]; 

私のコード今まで:

function sortCategories($data) { 
    $output = []; 
    foreach ($data as $category) { 
    if ($output[$category['id']] || $output[$category['parent_id']]) 
     continue; 

    if (!$output[$category['parent_id']]) 
     $output = getParentCategories($category, $ouput, $data); 

    $output[$category['id']] = [ 
     'id' => $category['id'], 
     'name' => $category['name'], 
     'parent_id' => $category['parent_id'] 
    ]; 
    } 
    return $output; 
} 

function getParentCategories($category, $output, $data) { 
    if ($output[$category['parent_id']]) { 
    return $output; 
    } else { 
    } 
} 

私が持っている問題は、私がいないということですおそらくgetParentCategories()を実装して、この関数がルートカテゴリを正しく処理するようにする方法を知っています。

問題の解決方法を教えてください。

+0

@Anantかさえ短い:https://eval.in/599831 – PaulH

+0

残念ながらありません。なぜなら私はparent_idで配列をソートできないからです。 – Bene

+0

'root'と' child'を明確にすることができますか?たぶんこれらの言葉を落として、代わりに 'parent_id'と' id'(あるいはその逆、それは混乱の可能性があります)を使用してください。同義語を避けることがITの優れた習慣です。 – PaulH

答えて

1

: -

<?php 
$data = [ 
    ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ], 
    ['id' => '4', 'name' => 'def', 'parent_id' => '5' ], 
    ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ], 
    ['id' => '5', 'name' => 'zst', 'parent_id' => '1' ], 
    ['id' => '2', 'name' => 'klm', 'parent_id' => '1' ], 
]; // original array 

$new_array = array(); // new empty array 

foreach($data as $key=>$value){ // iterate through original array 
    if($value['parent_id'] == 0){ // check root value 
     $new_array[$value['id']] = $value; // assign full sub-array to newly created array 
    }else{ // if not root value 
     $get_key = searchForId($value['parent_id'],$data); // based on parent-id get the parent array key from original array 
      $new_array[$data[$get_key]['id']] = $data[$get_key]; // based on key assign parent array to the newly created array 
      $new_array[$value['id']] = $value; // assign the child array to newly created array 
    } 

} 
function searchForId($id, $array) { // send parent_id and original array 
    foreach ($array as $key => $val) { 
     if ($val['id'] === $id) { 
      return $key; // return key of parent id 
     } 
    } 
    return null; 
} 
echo "<pre/>";print_r($new_array); // print new array 
?> 

出力: - https://eval.in/599837

+0

のコードをテストしました。あなたの説明は、私が解決しようとしていた実際の問題を理解するために多くの助けとなりました。ちょっと遊んだだけで、別の解決策で自分自身を解決する必要があります。どうもありがとう! – Bene

+1

@Beneあなたは大歓迎です。私はこのコードもsort + cleanだと思う –

1

PHP 7ので、我々はこの

usort($output, function ($a,$b) { 
    return $a['parent_id'].$a['id'] <=> $b['parent_id'].$b['id']; 
}); 

よう宇宙船演算子を使用することができidparent_idがソートされ、parent_idid優先を有するよう者が連結されている両方のID。

実際には、idの範囲は0.90を超え、5 <となります。これは上記のコードのように文字列を比較する場合には当てはまりません。それを考慮に入れたコードを投稿し、レビューしてもらうこともできます。また、最初に'1' => ['id' => '1']1 => ['id' => 1]の違いについて知ることもできます。

foreach()を使用したソリューションは、あなたのために動作します
+0

しかし古いバージョンはどうですか?あなたのコードをphp5.514でテストしたところ、うまくいきませんでした。 –

+0

@Anant私はあなたにそれを変換する練習をしたいと思います。 – PaulH

+1

私には、OPに。彼/彼女はそれが必要かもしれないので(古いバージョンのため) –

関連する問題