作者gpmm (銀色)
看板PHP
標題Re: [請益] 請問如何排序?很困難…
時間Sun Jan 1 02:14:52 2012
※ 引述《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