Re: [請益] 請問如何排序?很困難…

看板PHP作者 (銀色)時間12年前 (2012/01/01 02:14), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《dowbatw (Dowbatw)》之銘言: : 如蒙解惑,不勝感激! 你的資料應該很難純以排序來處理, 因為元素彼此之間不是只有次序,還有從屬關係, 所謂一般性的排序指的是「拿起兩個元素依某個規則判斷次序,然後調整其位置」 如果你的資料無法在兩個元素之間有絕對性的次序判斷, 就不太有辦法純以排序來解。 回歸正題,我寫了一個相鄰排序的解,可以解你給的資料 (因為你的資料正好是相鄰可排序的特例) 比較函式: function cmpare ($a, $b) { $ab = isset ($a['belong']); $bb = isset ($b['belong']); // (! $ab && $bb) || (! $ab && ! $bb) if (! $ab) return 0; else if ($ab && ! $bb) return 1; // $ab && $bb else { if ($a['belong'] == $b['belong']) return $a['order'] < $b['order'] ? 0 : 1; else if ($b['label'] == $a['belong']) return 1; return 0; } } 假設你給的資料陣列變數是 $set,以 compare 做排序: $set = array_values ($set); $size = count ($set); $new = Array (); for ($i=0; $i<$size; $i++) { if (isset ($set[$i + 1]) && cmpare ($set[$i], $set[$i + 1])) { $tmp = $set[$i]; $set[$i] = $set[$i + 1]; $set[$i + 1] = $tmp; } $new[$set[$i]['label']] = $set[$i]; } 輸出: var_dump ($new); 如我一開始所說,這是特例解, 假設你的資料不在此「相鄰可排序」的特例範圍內就要另外再做處理了… -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.249.65

01/01 02:19, , 1F
補充一下,這也是為什麼不能直接 uasort ($set, 'compare')
01/01 02:19, 1F

01/01 13:41, , 2F
謝謝前輩辛勞,經過我shuffle試驗,似乎沒辦法一開始就把
01/01 13:41, 2F

01/01 13:42, , 3F
「最高層級」者移到最左邊,可能是因為用bubblesort結果?
01/01 13:42, 3F

01/01 13:42, , 4F
我再試試看
01/01 13:42, 4F

01/01 14:33, , 5F
     更正:左半部
01/01 14:33, 5F
文章代碼(AID): #1E_r4VTg (PHP)
文章代碼(AID): #1E_r4VTg (PHP)