看板 PHP 關於我們 聯絡資訊
※ 引述《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
gpmm:補充一下,這也是為什麼不能直接 uasort ($set, 'compare') 01/01 02:19
dowbatw:謝謝前輩辛勞,經過我shuffle試驗,似乎沒辦法一開始就把 01/01 13:41
dowbatw:「最高層級」者移到最左邊,可能是因為用bubblesort結果? 01/01 13:42
dowbatw:我再試試看 01/01 13:42
dowbatw:      更正:左半部 01/01 14:33