2016-12-31 270 views
1

我有一個數組數組 - 每個數組都有自己的id和父id值。 我想對它進行排序,以便每個孩子都應該在它的父母之下。 讓我告訴你我的代碼:PHP - 按父級和ID排序數組(高級)

  1. 定的數組:

    $arr = array(array('id' => 15, 'parent' => 12), 
    array('id' => 10, 'parent' => 12), 
    array('id' => 12, 'parent' => 12), 
    array('id' => 17, 'parent' => 12), 
    array('id' => 21, 'parent' => 15), 
    array('id' => 13, 'parent' => 15), 
    array('id' => 15, 'parent' => 15), 
    array('id' => 25, 'parent' => 15), 
    array('id' => 7, 'parent' => 7), 
    array('id' => 18, 'parent' => 7), 
    array('id' => 4, 'parent' => 7), 
    array('id' => 1, 'parent' => 3), 
    array('id' => 5, 'parent' => 5), 
    array('id' => 2, 'parent' => 7)); 
    
  2. 如何輸出應該looki像(ASC家長,每個孩子也上升 - 總是在父(母總是像第一)):

     0 => 
          'id' => int 1 
          'parent' => int 3 
         1 => 
          'id' => int 5 
          'parent' => int 5 
         2 => 
          'id' => int 7 
          'parent' => int 7 
         3 => 
          'id' => int 2 
          'parent' => int 7 
         4 => 
          'id' => int 4 
          'parent' => int 7 
         5 => 
          'id' => int 18 
          'parent' => int 7 
         6 => 
          'id' => int 12 
          'parent' => int 12 
         7 => 
          'id' => int 10 
          'parent' => int 12 
         8 => 
          'id' => int 15 
          'parent' => int 12 
         9 => 
          'id' => int 17 
          'parent' => int 12 
         10 => 
          'id' => int 15 
          'parent' => int 15 
         11 => 
          'id' => int 13 
          'parent' => int 15 
         12 => 
          'id' => int 21 
          'parent' => int 15 
         13 => 
          'id' => int 25 
          'parent' => int 15 
    
  3. 問: 我'想知道什麼是實現這一目標的最簡單的解決方案?我已經成功地做到這一點,但我不能停止的感覺,有一種方法做,在更快,更優化的方式..

  4. 這裏是我的代碼:

    function groupByParent ($array) 
    { 
        $groups = array(); 
        foreach ($array as $a) { 
         $groups[$a['parent']][] = $a; 
        } 
        return $groups; 
    } 
    function insideSort ($array) 
    { 
        foreach ($array as $k => $v) { 
         usort($array[$k], function($a, $b){ 
          return $a['id'] == $b['parent'] ? -1 : 1; 
         }); 
         $f = array_shift($array[$k]); 
         sort($array[$k]); 
         array_unshift($array[$k], $f); 
        } 
        return $array; 
    } 
    function finalSort($array) 
    { 
        $final = array(); 
        foreach ($array as $a) { 
         $final = array_merge($final, $a); 
        } 
        return $final; 
    } 
    
    $grr = groupByParent($arr); 
    $irr = insideSort($grr); 
    ksort($irr); 
    $res = finalSort($irr); 
    
  5. 有更簡單的方法來實現它?

乾杯

回答

0

你想在看向usort排序通過使用用戶定義的比較函數值的數組

<?php 
$arr = [ 
    ['id' => 15, 'parent' => 12], 
    ['id' => 10, 'parent' => 12], 
    ['id' => 12, 'parent' => 12], 
    ['id' => 17, 'parent' => 12], 
    ['id' => 21, 'parent' => 15], 
    ['id' => 13, 'parent' => 15], 
    ['id' => 15, 'parent' => 15], 
    ['id' => 25, 'parent' => 15], 
    ['id' => 7, 'parent' => 7], 
    ['id' => 18, 'parent' => 7], 
    ['id' => 4, 'parent' => 7], 
    ['id' => 1, 'parent' => 3], 
    ['id' => 5, 'parent' => 5], 
    ['id' => 2, 'parent' => 7], 
]; 
usort(
    $arr, 
    function ($a, $b) { 
     if ($a['parent'] == $b['parent']) { 
      if ($a['id'] == $b['id']) { 
       return 0; 
      } 

      return ($a['id'] < $b['id']) ? -1 : 1; 
     } 

     return ($a['parent'] < $b['parent']) ? -1 : 1; 
    } 
); 
var_dump($arr); 

此輸出

array(14) { 
    [11]=> 
    array(2) { 
    ["id"]=> 
    int(1) 
    ["parent"]=> 
    int(3) 
    } 
    [12]=> 
    array(2) { 
    ["id"]=> 
    int(5) 
    ["parent"]=> 
    int(5) 
    } 
    [13]=> 
    array(2) { 
    ["id"]=> 
    int(2) 
    ["parent"]=> 
    int(7) 
    } 
    [10]=> 
    array(2) { 
    ["id"]=> 
    int(4) 
    ["parent"]=> 
    int(7) 
    } 
    [8]=> 
    array(2) { 
    ["id"]=> 
    int(7) 
    ["parent"]=> 
    int(7) 
    } 
    [9]=> 
    array(2) { 
    ["id"]=> 
    int(18) 
    ["parent"]=> 
    int(7) 
    } 
    [1]=> 
    array(2) { 
    ["id"]=> 
    int(10) 
    ["parent"]=> 
    int(12) 
    } 
    [2]=> 
    array(2) { 
    ["id"]=> 
    int(12) 
    ["parent"]=> 
    int(12) 
    } 
    [0]=> 
    array(2) { 
    ["id"]=> 
    int(15) 
    ["parent"]=> 
    int(12) 
    } 
    [3]=> 
    array(2) { 
    ["id"]=> 
    int(17) 
    ["parent"]=> 
    int(12) 
    } 
    [5]=> 
    array(2) { 
    ["id"]=> 
    int(13) 
    ["parent"]=> 
    int(15) 
    } 
    [6]=> 
    array(2) { 
    ["id"]=> 
    int(15) 
    ["parent"]=> 
    int(15) 
    } 
    [4]=> 
    array(2) { 
    ["id"]=> 
    int(21) 
    ["parent"]=> 
    int(15) 
    } 
    [7]=> 
    array(2) { 
    ["id"]=> 
    int(25) 
    ["parent"]=> 
    int(15) 
    } 
} 
➜ promote-api git:(develop) ✗ php test.php 
array(14) { 
    [0]=> 
    array(2) { 
    ["id"]=> 
    int(1) 
    ["parent"]=> 
    int(3) 
    } 
    [1]=> 
    array(2) { 
    ["id"]=> 
    int(5) 
    ["parent"]=> 
    int(5) 
    } 
    [2]=> 
    array(2) { 
    ["id"]=> 
    int(2) 
    ["parent"]=> 
    int(7) 
    } 
    [3]=> 
    array(2) { 
    ["id"]=> 
    int(4) 
    ["parent"]=> 
    int(7) 
    } 
    [4]=> 
    array(2) { 
    ["id"]=> 
    int(7) 
    ["parent"]=> 
    int(7) 
    } 
    [5]=> 
    array(2) { 
    ["id"]=> 
    int(18) 
    ["parent"]=> 
    int(7) 
    } 
    [6]=> 
    array(2) { 
    ["id"]=> 
    int(10) 
    ["parent"]=> 
    int(12) 
    } 
    [7]=> 
    array(2) { 
    ["id"]=> 
    int(12) 
    ["parent"]=> 
    int(12) 
    } 
    [8]=> 
    array(2) { 
    ["id"]=> 
    int(15) 
    ["parent"]=> 
    int(12) 
    } 
    [9]=> 
    array(2) { 
    ["id"]=> 
    int(17) 
    ["parent"]=> 
    int(12) 
    } 
    [10]=> 
    array(2) { 
    ["id"]=> 
    int(13) 
    ["parent"]=> 
    int(15) 
    } 
    [11]=> 
    array(2) { 
    ["id"]=> 
    int(15) 
    ["parent"]=> 
    int(15) 
    } 
    [12]=> 
    array(2) { 
    ["id"]=> 
    int(21) 
    ["parent"]=> 
    int(15) 
    } 
    [13]=> 
    array(2) { 
    ["id"]=> 
    int(25) 
    ["parent"]=> 
    int(15) 
    } 
} 
+0

- 不工作 - 父母總是對的arent子女 – user7360969