-4

ID > 親を格納する配列があります

私がやりたいことは、PHP の uasort 関数を使用してこの配列をソートし、すべての子を親の下に配置することです

もし私が持っているなら

ID>>PARENT
1 >> 0
2 >> 0
3 >> 1
4 >> 1
5 >> 0
6 >> 2
7 >> 6
8 >> 6
9 >> 2

次に、このような結果を返す必要があります

ID
1
3
4
2
6
7
8
9

私の配列はこのようなものです

Array (
     [0] => Array
        (
            [ID] => 1
            [PARENT] => 0
        ) 

     [1] => Array
        (
            [ID] => 2
            [PARENT] => 0
        ) 

     [2] => Array
        (
            [ID] => 3
            [PARENT] => 1
        ) 

     [3] => Array
        (
            [ID] => 4
            [PARENT] => 1
        ) 

     [4] => Array
        (
            [ID] => 5
            [PARENT] => 0
        ) 
     [5] => Array
        (
            [ID] => 6
            [PARENT] => 2
        ) 

     [6] => Array
        (
            [ID] =>7
            [PARENT] => 6
        ) 

     [7] => Array
        (
            [ID] =>8
            [PARENT] => 6
        ) 

     [8] => Array
        (
            [ID] =>9
            [PARENT] => 9
        ) 
)

これは私がやったことです

uasort($survey, 'cmp');

print_r($survey);


function cmp($a, $b) {
    if ($a['parent_id'] == $b['parent_id']) {
        return 0;
    }
    return ($a['parent_id'] < $b['parent_id']) ? -1 : 1;
}

このコードは、すべての親を最初に並べ替え、次に子を親の後に並べ替えます。

誰かがこの問題について私を助けてくれますか?

4

2 に答える 2

3

uasort()親 N の最後の子を次の親 N+1 と比較したいとします。子はより小さいものとして比較する必要があります。同じ子が親 N+1 を持っている場合、より大きく比較する必要があります。これは、レベルが 1 つしかない限り実行可能ですが、複数のレベルがある場合は厄介になります。

別のアプローチを使用することをお勧めします。

  • ステップ 1: エントリを親ごとに配列の配列にグループ化する
  • ステップ 2: サブアレイを個別に並べ替える
  • ステップ 3: 再帰によって構造を平坦化します。
    • 現在の親 ID 0 と空の final で開始します
    • 繰り返す
      • 現在の親IDを持つ配列の最初の行を最終配列の最後に移動します
      • 利用できない場合は、戻ります
      • この行の ID を現在の親 ID として再帰します

編集

要求されたいくつかのコード:これはあなたの例でうまくいきます。

あなたの例は少し伸縮性があるように見えることに注意してください: 希望する出力には ID 5 がありません。ほとんどのルート ノードは親として 0 を使用しますが、ID 9 は ID==PARENT を使用します。

<?php
function flatten($parentid, &$parents, &$final) {
  if (!isset($parents[$parentid])) return;
  $children=$parents[$parentid];
  unset($parents[$parentid]);

  //repeat
  while (true) {
    //move the first row of the array with the current parent id to the end of the final array
    $child=array_shift($children);

    //if none available, return
    if (!$child) break;
    $final[]=$child;

    //recurse with the id of this row as the current parent id
    flatten($child['ID'],$parents,$final);
  }
}

//Step 1: Group entries into an array of arrays by parent
//In your input, both PARENT==ID and PARENT==0 are used for root nodes
$parents=array();
foreach ($input as $item) {
  $parent=$item['PARENT'];
  if ($parent==$item['ID']) $parent=0;
  if (isset($parents[$parent])) $parents[$parent][$item['ID']]=$item;
  else $parents[$parent]=array($item['ID']=>$item);
}

//Step 2: Sort the sub-arrays individually
foreach ($parents as $item) ksort($item);

//Step 3: Flatten the structure by recursion:
//start with current parent id 0 and an empty final
$final=array();
flatten(0, $parents, $final);

//Done
print_r($final);
?>
于 2013-07-03T19:21:10.690 に答える
0

配列をループし、ソートされたバージョンを構築します。

$arr2 = array();
    foreach ( $arr as $k => $v ) {
        if ( $v['PARENT'] > 0 ) {
            $arr2[$v['PARENT']][$k] = $v;   
        }
    }
ksort($arr2);

あなたの例を使用して(そしてあなたの情報の不一致を修正して)、次のようになります。

Array
(
    [1] => Array
        (
            [3] => Array
                (
                    [ID] => 3
                    [PARENT] => 1
                )
            [4] => Array
                (
                    [ID] => 4
                    [PARENT] => 1
                )
        )
    [2] => Array
        (
            [6] => Array
                (
                    [ID] => 6
                    [PARENT] => 2
                )
            [9] => Array
                (
                    [ID] => 9
                    [PARENT] => 2
                )
        )
    [6] => Array
        (
            [7] => Array
                (
                    [ID] => 7
                    [PARENT] => 6
                )

            [8] => Array
                (
                    [ID] => 8
                    [PARENT] => 6
                )
        )
)
于 2013-07-03T20:03:42.413 に答える